Release 20000801.
[wine] / scheduler / event.c
1 /*
2  * Win32 events
3  *
4  * Copyright 1998 Alexandre Julliard
5  */
6
7 #include <assert.h>
8 #include <string.h>
9 #include "winerror.h"
10 #include "syslevel.h"
11 #include "server.h"
12
13
14 /***********************************************************************
15  *           CreateEventA    (KERNEL32.156)
16  */
17 HANDLE WINAPI CreateEventA( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
18                             BOOL initial_state, LPCSTR name )
19 {
20     struct create_event_request *req = get_req_buffer();
21
22     req->manual_reset = manual_reset;
23     req->initial_state = initial_state;
24     req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
25     server_strcpyAtoW( req->name, name );
26     SetLastError(0);
27     server_call( REQ_CREATE_EVENT );
28     if (req->handle == -1) return 0;
29     return req->handle;
30 }
31
32
33 /***********************************************************************
34  *           CreateEventW    (KERNEL32.157)
35  */
36 HANDLE WINAPI CreateEventW( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
37                             BOOL initial_state, LPCWSTR name )
38 {
39     struct create_event_request *req = get_req_buffer();
40
41     req->manual_reset = manual_reset;
42     req->initial_state = initial_state;
43     req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
44     server_strcpyW( req->name, name );
45     SetLastError(0);
46     server_call( REQ_CREATE_EVENT );
47     if (req->handle == -1) return 0;
48     return req->handle;
49 }
50
51 /***********************************************************************
52  *           WIN16_CreateEvent    (KERNEL.457)
53  */
54 HANDLE WINAPI WIN16_CreateEvent( BOOL manual_reset, BOOL initial_state )
55 {
56     return CreateEventA( NULL, manual_reset, initial_state, NULL );
57 }
58
59
60 /***********************************************************************
61  *           OpenEventA    (KERNEL32.536)
62  */
63 HANDLE WINAPI OpenEventA( DWORD access, BOOL inherit, LPCSTR name )
64 {
65     struct open_event_request *req = get_req_buffer();
66
67     req->access  = access;
68     req->inherit = inherit;
69     server_strcpyAtoW( req->name, name );
70     server_call( REQ_OPEN_EVENT );
71     if (req->handle == -1) return 0; /* must return 0 on failure, not -1 */
72     return req->handle;
73 }
74
75
76 /***********************************************************************
77  *           OpenEventW    (KERNEL32.537)
78  */
79 HANDLE WINAPI OpenEventW( DWORD access, BOOL inherit, LPCWSTR name )
80 {
81     struct open_event_request *req = get_req_buffer();
82
83     req->access  = access;
84     req->inherit = inherit;
85     server_strcpyW( req->name, name );
86     server_call( REQ_OPEN_EVENT );
87     if (req->handle == -1) return 0; /* must return 0 on failure, not -1 */
88     return req->handle;
89 }
90
91
92 /***********************************************************************
93  *           EVENT_Operation
94  *
95  * Execute an event operation (set,reset,pulse).
96  */
97 static BOOL EVENT_Operation( HANDLE handle, enum event_op op )
98 {
99     struct event_op_request *req = get_req_buffer();
100     req->handle = handle;
101     req->op     = op;
102     return !server_call( REQ_EVENT_OP );
103 }
104
105
106 /***********************************************************************
107  *           PulseEvent    (KERNEL32.557)
108  */
109 BOOL WINAPI PulseEvent( HANDLE handle )
110 {
111     return EVENT_Operation( handle, PULSE_EVENT );
112 }
113
114
115 /***********************************************************************
116  *           SetEvent    (KERNEL32.644)
117  */
118 BOOL WINAPI SetEvent( HANDLE handle )
119 {
120     return EVENT_Operation( handle, SET_EVENT );
121 }
122
123
124 /***********************************************************************
125  *           ResetEvent    (KERNEL32.586)
126  */
127 BOOL WINAPI ResetEvent( HANDLE handle )
128 {
129     return EVENT_Operation( handle, RESET_EVENT );
130 }
131
132
133 /***********************************************************************
134  * NOTE: The Win95 VWin32_Event routines given below are really low-level
135  *       routines implemented directly by VWin32. The user-mode libraries
136  *       implement Win32 synchronisation routines on top of these low-level
137  *       primitives. We do it the other way around here :-)
138  */
139
140 /***********************************************************************
141  *       VWin32_EventCreate     (KERNEL.442)
142  */
143 HANDLE WINAPI VWin32_EventCreate(VOID)
144 {
145     HANDLE hEvent = CreateEventA( NULL, FALSE, 0, NULL );
146     return ConvertToGlobalHandle( hEvent );
147 }
148
149 /***********************************************************************
150  *       VWin32_EventDestroy    (KERNEL.443)
151  */
152 VOID WINAPI VWin32_EventDestroy(HANDLE event)
153 {
154     CloseHandle( event );
155 }
156
157 /***********************************************************************
158  *       VWin32_EventWait       (KERNEL.450) 
159  */
160 VOID WINAPI VWin32_EventWait(HANDLE event)
161 {
162     SYSLEVEL_ReleaseWin16Lock();
163     WaitForSingleObject( event, INFINITE );
164     SYSLEVEL_RestoreWin16Lock();
165 }
166
167 /***********************************************************************
168  *       VWin32_EventSet        (KERNEL.451)
169  */
170 VOID WINAPI VWin32_EventSet(HANDLE event)
171 {
172     SetEvent( event );
173 }
174