75 lines
1.5 KiB
C
75 lines
1.5 KiB
C
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
locking.h
|
|
|
|
Abstract:
|
|
|
|
Private header file for locking/synchronization functions
|
|
within setup api dll.
|
|
|
|
Author:
|
|
|
|
Ted Miller (tedm) 31-Mar-1995
|
|
|
|
Revision History:
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Locking functions. These functions are used to make various parts of
|
|
// the DLL multithread-safe. The basic idea is to have a mutex and an event.
|
|
// The mutex is used to synchronize access to the structure being guarded.
|
|
// The event is only signalled when the structure being guarded is destroyed.
|
|
// To gain access to the guarded structure, a routine waits on both the mutex
|
|
// and the event. If the event gets signalled, then the structure was destroyed.
|
|
// If the mutex gets signalled, then the thread has access to the structure.
|
|
|
|
typedef struct _MYLOCK {
|
|
HANDLE Handles[2];
|
|
} MYLOCK, *PMYLOCK;
|
|
|
|
|
|
// Indices into Locks array in string table structure.
|
|
|
|
#define TABLE_DESTROYED_EVENT 0
|
|
#define TABLE_ACCESS_MUTEX 1
|
|
|
|
BOOL
|
|
__inline
|
|
BeginSynchronizedAccess(
|
|
IN PMYLOCK Lock
|
|
)
|
|
{
|
|
DWORD d = WaitForMultipleObjects(2,Lock->Handles,FALSE,INFINITE);
|
|
|
|
// Success if the mutex object satisfied the wait;
|
|
// Failure if the table destroyed event satisified the wait, or
|
|
// the mutex was abandoned, etc.
|
|
|
|
return((d - WAIT_OBJECT_0) == TABLE_ACCESS_MUTEX);
|
|
}
|
|
|
|
VOID
|
|
__inline
|
|
EndSynchronizedAccess(
|
|
IN PMYLOCK Lock
|
|
)
|
|
{
|
|
ReleaseMutex(Lock->Handles[TABLE_ACCESS_MUTEX]);
|
|
}
|
|
|
|
BOOL
|
|
InitializeSynchronizedAccess(
|
|
OUT PMYLOCK Lock
|
|
);
|
|
|
|
VOID
|
|
DestroySynchronizedAccess(
|
|
IN OUT PMYLOCK Lock
|
|
);
|