update for HEAD-2003091401
[reactos.git] / subsys / win32k / objects / semaphor.c
1
2 #undef WIN32_LEAN_AND_MEAN
3 #include <windows.h>
4 #include <stdlib.h>
5 #include <win32k/bitmaps.h>
6 #include <win32k/debug.h>
7 #include <win32k/debug1.h>
8 #include <debug.h>
9 #include <ddk/winddi.h>
10 #include "../eng/objects.h"
11 #include <include/error.h>
12
13 /*
14  * @implemented
15  */
16 HSEMAPHORE
17 STDCALL
18 EngCreateSemaphore ( VOID )
19 {
20   // www.osr.com/ddk/graphics/gdifncs_95lz.htm
21   PERESOURCE psem = ExAllocatePool ( NonPagedPool, sizeof(ERESOURCE) );
22   if ( !psem )
23     return NULL;
24   if ( !NT_SUCCESS(ExInitializeResourceLite ( psem )) )
25   {
26     ExFreePool ( psem );
27     return NULL;
28   }
29   return (HSEMAPHORE)psem;
30 }
31
32 /*
33  * @implemented
34  */
35 VOID
36 STDCALL
37 EngAcquireSemaphore ( IN HSEMAPHORE hsem )
38 {
39   // www.osr.com/ddk/graphics/gdifncs_14br.htm
40   ASSERT(hsem);
41   ExAcquireResourceExclusiveLite ( (PERESOURCE)hsem, TRUE );
42 }
43
44 /*
45  * @implemented
46  */
47 VOID
48 STDCALL
49 EngReleaseSemaphore ( IN HSEMAPHORE hsem )
50 {
51   // www.osr.com/ddk/graphics/gdifncs_5u3r.htm
52   ASSERT(hsem);
53   ExReleaseResourceLite ( (PERESOURCE)hsem );
54 }
55
56 /*
57  * @implemented
58  */
59 VOID
60 STDCALL
61 EngDeleteSemaphore ( IN HSEMAPHORE hsem )
62 {
63   // www.osr.com/ddk/graphics/gdifncs_13c7.htm
64   ASSERT ( hsem );
65   ExFreePool ( (PVOID)hsem );
66 }
67
68 /*
69  * @implemented
70  */
71 BOOL
72 STDCALL
73 EngIsSemaphoreOwned ( IN HSEMAPHORE hsem )
74 {
75   // www.osr.com/ddk/graphics/gdifncs_6wmf.htm
76   ASSERT(hsem);
77   return (((PERESOURCE)hsem)->ActiveCount > 0);
78 }
79
80 /*
81  * @implemented
82  */
83 BOOL
84 STDCALL
85 EngIsSemaphoreOwnedByCurrentThread ( IN HSEMAPHORE hsem )
86 {
87   // www.osr.com/ddk/graphics/gdifncs_9yxz.htm
88   ASSERT(hsem);
89   return ExIsResourceAcquiredExclusiveLite ( (PERESOURCE)hsem );
90 }