DosCreateSpinLock: Difference between revisions
Appearance
No edit summary |
|||
| Line 2: | Line 2: | ||
==Syntax== | ==Syntax== | ||
DosCreateSpinLock (pHandle) | APIRET APIENTRY DosCreateSpinLock (pHandle) | ||
==Parameters== | ==Parameters== | ||
| Line 22: | Line 22: | ||
typedef HSPINLOCK FAR *PHSPINLOCK; | typedef HSPINLOCK FAR *PHSPINLOCK; | ||
APIRET APIENTRY DosCreateSpinLock(PHSPINLOCK pHandle); | APIRET APIENTRY DosCreateSpinLock(PHSPINLOCK pHandle); | ||
VOID APIENTRY DosAcquireSpinLock(HSPINLOCK Handle); | |||
VOID APIENTRY DosReleaseSpinLock(HSPINLOCK Handle); | |||
APIRET APIENTRY DosFreeSpinLock(HSPINLOCK Handle); | APIRET APIENTRY DosFreeSpinLock(HSPINLOCK Handle); | ||
}; | }; | ||
Revision as of 07:50, 19 July 2023
Create a spinlock for multiprocessor serialisation.
Syntax
APIRET APIENTRY DosCreateSpinLock (pHandle)
Parameters
- phandle (PHSPINLOCK)
- A pointer to the spinlock handle that can be passed to DosAcquireSpinLock to acquire a spinlock and to DosReleaseSpinLock to release the spinlock.
Returns
- ulrc (APIRET)
- 0 NO_ERROR
- 32804 ERROR_NO_MORE_HANDLES
Remarks
The device driver should protect access to critical resources using spinlocks. The device driver allocates spinlocks in the Init routine by calling DevHlp_CreateSpinLock. CreateSpinLock returns a handle for use by the device driver. This handle is passed to DevHlp_AcquireSpinLock and DevHlp_ReleaseSpinLock. The spinlock is freed by calling DevHlp_FreeSpinLock. The driver may request any number of spinlocks, as the spinlocks are represented by a very small data structure. Once created, the spinlocks never go away.
Example Code
// OS/2 adv srv 4 SMP spinlock
extern "C" {
typedef ULONG HSPINLOCK;
typedef HSPINLOCK FAR *PHSPINLOCK;
APIRET APIENTRY DosCreateSpinLock(PHSPINLOCK pHandle);
VOID APIENTRY DosAcquireSpinLock(HSPINLOCK Handle);
VOID APIENTRY DosReleaseSpinLock(HSPINLOCK Handle);
APIRET APIENTRY DosFreeSpinLock(HSPINLOCK Handle);
};
class SpinLock {
HSPINLOCK sl;
public:
SpinLock() { DosCreateSpinLock(&sl); }
~SpinLock() { DosFreeSpinLock(sl); }
void Request() {
DosAcquireSpinLock(sl);
}
void Release() {
DosReleaseSpinLock(sl);
}
};