blob: c26112478d12faf1e5024ddecabe1f6fcad72289 [file] [log] [blame]
Alexandre Julliard02e90081998-01-04 17:49:09 +00001/*
2 * Win32 events
3 *
4 * Copyright 1998 Alexandre Julliard
5 */
6
7#include <assert.h>
David Luyeree517e81999-02-28 12:27:56 +00008#include <string.h>
Alexandre Julliard02e90081998-01-04 17:49:09 +00009#include "winerror.h"
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000010#include "syslevel.h"
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000011#include "server.h"
Alexandre Julliard02e90081998-01-04 17:49:09 +000012
Alexandre Julliard02e90081998-01-04 17:49:09 +000013
14/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000015 * CreateEventA (KERNEL32.156)
Alexandre Julliard02e90081998-01-04 17:49:09 +000016 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000017HANDLE WINAPI CreateEventA( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
Alexandre Julliardd16319c1999-11-25 21:30:24 +000018 BOOL initial_state, LPCSTR name )
Alexandre Julliard02e90081998-01-04 17:49:09 +000019{
Alexandre Julliardebe29ef1999-06-26 08:43:26 +000020 struct create_event_request *req = get_req_buffer();
Alexandre Julliard02e90081998-01-04 17:49:09 +000021
Alexandre Julliardebe29ef1999-06-26 08:43:26 +000022 req->manual_reset = manual_reset;
23 req->initial_state = initial_state;
24 req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
Alexandre Julliardd16319c1999-11-25 21:30:24 +000025 server_strcpyAtoW( req->name, name );
Alexandre Julliard3f09ec51999-02-28 19:25:51 +000026 SetLastError(0);
Alexandre Julliardebe29ef1999-06-26 08:43:26 +000027 server_call( REQ_CREATE_EVENT );
28 if (req->handle == -1) return 0;
29 return req->handle;
Alexandre Julliard02e90081998-01-04 17:49:09 +000030}
31
32
33/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000034 * CreateEventW (KERNEL32.157)
Alexandre Julliard02e90081998-01-04 17:49:09 +000035 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000036HANDLE WINAPI CreateEventW( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
Alexandre Julliardd16319c1999-11-25 21:30:24 +000037 BOOL initial_state, LPCWSTR name )
Alexandre Julliard02e90081998-01-04 17:49:09 +000038{
Alexandre Julliardd16319c1999-11-25 21:30:24 +000039 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;
Alexandre Julliard02e90081998-01-04 17:49:09 +000049}
50
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000051/***********************************************************************
52 * WIN16_CreateEvent (KERNEL.457)
53 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000054HANDLE WINAPI WIN16_CreateEvent( BOOL manual_reset, BOOL initial_state )
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000055{
Alexandre Julliarda3960291999-02-26 11:11:13 +000056 return CreateEventA( NULL, manual_reset, initial_state, NULL );
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000057}
58
Alexandre Julliard02e90081998-01-04 17:49:09 +000059
60/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000061 * OpenEventA (KERNEL32.536)
Alexandre Julliard02e90081998-01-04 17:49:09 +000062 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000063HANDLE WINAPI OpenEventA( DWORD access, BOOL inherit, LPCSTR name )
Alexandre Julliard02e90081998-01-04 17:49:09 +000064{
Alexandre Julliardebe29ef1999-06-26 08:43:26 +000065 struct open_event_request *req = get_req_buffer();
Alexandre Julliard55443871998-12-31 15:52:06 +000066
Alexandre Julliardebe29ef1999-06-26 08:43:26 +000067 req->access = access;
68 req->inherit = inherit;
Alexandre Julliardd16319c1999-11-25 21:30:24 +000069 server_strcpyAtoW( req->name, name );
Alexandre Julliardebe29ef1999-06-26 08:43:26 +000070 server_call( REQ_OPEN_EVENT );
71 if (req->handle == -1) return 0; /* must return 0 on failure, not -1 */
72 return req->handle;
Alexandre Julliard02e90081998-01-04 17:49:09 +000073}
74
75
76/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000077 * OpenEventW (KERNEL32.537)
Alexandre Julliard02e90081998-01-04 17:49:09 +000078 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000079HANDLE WINAPI OpenEventW( DWORD access, BOOL inherit, LPCWSTR name )
Alexandre Julliard02e90081998-01-04 17:49:09 +000080{
Alexandre Julliardd16319c1999-11-25 21:30:24 +000081 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;
Alexandre Julliard02e90081998-01-04 17:49:09 +000089}
90
91
92/***********************************************************************
Alexandre Julliard55443871998-12-31 15:52:06 +000093 * EVENT_Operation
94 *
95 * Execute an event operation (set,reset,pulse).
96 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000097static BOOL EVENT_Operation( HANDLE handle, enum event_op op )
Alexandre Julliard55443871998-12-31 15:52:06 +000098{
Alexandre Julliardebe29ef1999-06-26 08:43:26 +000099 struct event_op_request *req = get_req_buffer();
100 req->handle = handle;
101 req->op = op;
102 return !server_call( REQ_EVENT_OP );
Alexandre Julliard55443871998-12-31 15:52:06 +0000103}
104
105
106/***********************************************************************
Alexandre Julliard02e90081998-01-04 17:49:09 +0000107 * PulseEvent (KERNEL32.557)
108 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000109BOOL WINAPI PulseEvent( HANDLE handle )
Alexandre Julliard02e90081998-01-04 17:49:09 +0000110{
Alexandre Julliard55443871998-12-31 15:52:06 +0000111 return EVENT_Operation( handle, PULSE_EVENT );
Alexandre Julliard02e90081998-01-04 17:49:09 +0000112}
113
114
115/***********************************************************************
116 * SetEvent (KERNEL32.644)
117 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000118BOOL WINAPI SetEvent( HANDLE handle )
Alexandre Julliard02e90081998-01-04 17:49:09 +0000119{
Alexandre Julliard55443871998-12-31 15:52:06 +0000120 return EVENT_Operation( handle, SET_EVENT );
Alexandre Julliard02e90081998-01-04 17:49:09 +0000121}
122
123
124/***********************************************************************
125 * ResetEvent (KERNEL32.586)
126 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000127BOOL WINAPI ResetEvent( HANDLE handle )
Alexandre Julliard02e90081998-01-04 17:49:09 +0000128{
Alexandre Julliard55443871998-12-31 15:52:06 +0000129 return EVENT_Operation( handle, RESET_EVENT );
Alexandre Julliard02e90081998-01-04 17:49:09 +0000130}
131
132
133/***********************************************************************
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000134 * 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 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000143HANDLE WINAPI VWin32_EventCreate(VOID)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000144{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000145 HANDLE hEvent = CreateEventA( NULL, FALSE, 0, NULL );
Ulrich Weigand4a546901998-10-24 12:00:33 +0000146 return ConvertToGlobalHandle( hEvent );
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000147}
148
149/***********************************************************************
150 * VWin32_EventDestroy (KERNEL.443)
151 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000152VOID WINAPI VWin32_EventDestroy(HANDLE event)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000153{
154 CloseHandle( event );
155}
156
157/***********************************************************************
158 * VWin32_EventWait (KERNEL.450)
159 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000160VOID WINAPI VWin32_EventWait(HANDLE event)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000161{
162 SYSLEVEL_ReleaseWin16Lock();
Alexandre Julliarda3960291999-02-26 11:11:13 +0000163 WaitForSingleObject( event, INFINITE );
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000164 SYSLEVEL_RestoreWin16Lock();
165}
166
167/***********************************************************************
168 * VWin32_EventSet (KERNEL.451)
169 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000170VOID WINAPI VWin32_EventSet(HANDLE event)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000171{
172 SetEvent( event );
173}
174