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