1 /*****************************************************************************
2 
3   Mutex
4 
5 *****************************************************************************/
6 
7 
8 #ifndef MUTEX_H
9 #define MUTEX_H
10 
11 
12 #include "Unfrag.h"
13 
14 
15 class Mutex
16 {
17 public:
18     Mutex ()
19     {
20     	// NT only code begin ... Win9x disregards this part
21     	SECURITY_ATTRIBUTES MutexAttribs;
22 
23     	memset (&MutexAttribs, 0, sizeof (SECURITY_ATTRIBUTES));
24 
25     	MutexAttribs.bInheritHandle = false;
26     	MutexAttribs.nLength = sizeof (SECURITY_ATTRIBUTES);
27     	MutexAttribs.lpSecurityDescriptor = NULL;
28     	// NT only code end
29 
30     	Locked      = false;
31     	LockCount   = 0;
32     	MutexHandle = CreateMutex (&MutexAttribs, Locked, NULL);
33 
34         return;
35     }
36 
37     ~Mutex ()
38     {
39     	Lock ();
40     	CloseHandle (MutexHandle);
41     }
42 
43     void Lock (void)
44     {
45     	Locked = true;
46     	WaitForSingleObject (MutexHandle, INFINITE);
47     	LockCount += 1;
48         return;
49     }
50 
51 
52     void Unlock   (void)
53     {
54 	    LockCount -= 1;
55 	    if (LockCount <= 0)
56 	    {
57 		    LockCount = 0;
58 		    Locked = false;
59     	}
60 
61     	ReleaseMutex (MutexHandle);
62         return;
63     }
64 
65 
66     bool IsLocked (void)
67     {
68         return (Locked);
69     }
70 
71 protected:
72     uint32 LockCount;
73     HANDLE MutexHandle;
74     bool   Locked;
75 };
76 
77 
78 #endif // MUTEX_H
79