Removed client-side wait functions; all waiting is now done through
the server.
diff --git a/scheduler/event.c b/scheduler/event.c
index 552568d..30a1c76 100644
--- a/scheduler/event.c
+++ b/scheduler/event.c
@@ -18,69 +18,17 @@
typedef struct
{
K32OBJ header;
- THREAD_QUEUE wait_queue;
- BOOL32 manual_reset;
- BOOL32 signaled;
} EVENT;
-static BOOL32 EVENT_Signaled( K32OBJ *obj, DWORD thread_id );
-static BOOL32 EVENT_Satisfied( K32OBJ *obj, DWORD thread_id );
-static void EVENT_AddWait( K32OBJ *obj, DWORD thread_id );
-static void EVENT_RemoveWait( K32OBJ *obj, DWORD thread_id );
static void EVENT_Destroy( K32OBJ *obj );
const K32OBJ_OPS EVENT_Ops =
{
- EVENT_Signaled, /* signaled */
- EVENT_Satisfied, /* satisfied */
- EVENT_AddWait, /* add_wait */
- EVENT_RemoveWait, /* remove_wait */
- NULL, /* read */
- NULL, /* write */
EVENT_Destroy /* destroy */
};
/***********************************************************************
- * EVENT_Set
- *
- * Implementation of SetEvent. Used by ExitThread and ExitProcess.
- */
-void EVENT_Set( K32OBJ *obj )
-{
- EVENT *event = (EVENT *)obj;
- assert( obj->type == K32OBJ_EVENT );
- SYSTEM_LOCK();
- event->signaled = TRUE;
- SYNC_WakeUp( &event->wait_queue, event->manual_reset ? INFINITE32 : 1 );
- SYSTEM_UNLOCK();
-}
-
-/***********************************************************************
- * EVENT_Create
- *
- * Partial implementation of CreateEvent.
- * Used internally by processes and threads.
- */
-K32OBJ *EVENT_Create( BOOL32 manual_reset, BOOL32 initial_state )
-{
- EVENT *event;
-
- SYSTEM_LOCK();
- if ((event = HeapAlloc( SystemHeap, 0, sizeof(*event) )))
- {
- event->header.type = K32OBJ_EVENT;
- event->header.refcount = 1;
- event->wait_queue = NULL;
- event->manual_reset = manual_reset;
- event->signaled = initial_state;
- }
- SYSTEM_UNLOCK();
- return event ? &event->header : NULL;
-}
-
-
-/***********************************************************************
* CreateEvent32A (KERNEL32.156)
*/
HANDLE32 WINAPI CreateEvent32A( SECURITY_ATTRIBUTES *sa, BOOL32 manual_reset,
@@ -99,20 +47,15 @@
CLIENT_SendRequest( REQ_CREATE_EVENT, -1, 2, &req, sizeof(req), name, len );
CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
CHECK_LEN( len, sizeof(reply) );
- if (reply.handle == -1) return NULL;
+ if (reply.handle == -1) return 0;
SYSTEM_LOCK();
event = (EVENT *)K32OBJ_Create( K32OBJ_EVENT, sizeof(*event), name,
reply.handle, EVENT_ALL_ACCESS, sa, &handle );
if (event)
- {
- /* Finish initializing it */
- event->wait_queue = NULL;
- event->manual_reset = manual_reset;
- event->signaled = initial_state;
K32OBJ_DecCount( &event->header );
- }
SYSTEM_UNLOCK();
+ if (handle == INVALID_HANDLE_VALUE32) handle = 0;
return handle;
}
@@ -145,13 +88,29 @@
{
HANDLE32 handle = 0;
K32OBJ *obj;
- SYSTEM_LOCK();
- if ((obj = K32OBJ_FindNameType( name, K32OBJ_EVENT )) != NULL)
+ struct open_named_obj_request req;
+ struct open_named_obj_reply reply;
+ int len = name ? strlen(name) + 1 : 0;
+
+ req.type = OPEN_EVENT;
+ req.access = access;
+ req.inherit = inherit;
+ CLIENT_SendRequest( REQ_OPEN_NAMED_OBJ, -1, 2, &req, sizeof(req), name, len );
+ CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
+ CHECK_LEN( len, sizeof(reply) );
+ if (reply.handle != -1)
{
- handle = HANDLE_Alloc( PROCESS_Current(), obj, access, inherit, -1 );
- K32OBJ_DecCount( obj );
+ SYSTEM_LOCK();
+ if ((obj = K32OBJ_FindNameType( name, K32OBJ_EVENT )) != NULL)
+ {
+ handle = HANDLE_Alloc( PROCESS_Current(), obj, access, inherit, reply.handle );
+ K32OBJ_DecCount( obj );
+ if (handle == INVALID_HANDLE_VALUE32)
+ handle = 0; /* must return 0 on failure, not -1 */
+ }
+ else CLIENT_CloseHandle( reply.handle );
+ SYSTEM_UNLOCK();
}
- SYSTEM_UNLOCK();
return handle;
}
@@ -169,33 +128,29 @@
/***********************************************************************
+ * EVENT_Operation
+ *
+ * Execute an event operation (set,reset,pulse).
+ */
+static BOOL32 EVENT_Operation( HANDLE32 handle, enum event_op op )
+{
+ struct event_op_request req;
+
+ req.handle = HANDLE_GetServerHandle( PROCESS_Current(), handle,
+ K32OBJ_EVENT, EVENT_MODIFY_STATE );
+ if (req.handle == -1) return FALSE;
+ req.op = op;
+ CLIENT_SendRequest( REQ_EVENT_OP, -1, 1, &req, sizeof(req) );
+ return !CLIENT_WaitReply( NULL, NULL, 0 );
+}
+
+
+/***********************************************************************
* PulseEvent (KERNEL32.557)
*/
BOOL32 WINAPI PulseEvent( HANDLE32 handle )
{
- struct event_op_request req;
- EVENT *event;
- SYSTEM_LOCK();
- if (!(event = (EVENT *)HANDLE_GetObjPtr(PROCESS_Current(), handle,
- K32OBJ_EVENT, EVENT_MODIFY_STATE,
- &req.handle )))
- {
- SYSTEM_UNLOCK();
- return FALSE;
- }
- if (req.handle != -1)
- {
- SYSTEM_UNLOCK();
- req.op = PULSE_EVENT;
- CLIENT_SendRequest( REQ_EVENT_OP, -1, 1, &req, sizeof(req) );
- return !CLIENT_WaitReply( NULL, NULL, 0 );
- }
- event->signaled = TRUE;
- SYNC_WakeUp( &event->wait_queue, event->manual_reset ? INFINITE32 : 1 );
- event->signaled = FALSE;
- K32OBJ_DecCount( &event->header );
- SYSTEM_UNLOCK();
- return TRUE;
+ return EVENT_Operation( handle, PULSE_EVENT );
}
@@ -204,28 +159,7 @@
*/
BOOL32 WINAPI SetEvent( HANDLE32 handle )
{
- struct event_op_request req;
- EVENT *event;
- SYSTEM_LOCK();
- if (!(event = (EVENT *)HANDLE_GetObjPtr(PROCESS_Current(), handle,
- K32OBJ_EVENT, EVENT_MODIFY_STATE,
- &req.handle )))
- {
- SYSTEM_UNLOCK();
- return FALSE;
- }
- if (req.handle != -1)
- {
- SYSTEM_UNLOCK();
- req.op = SET_EVENT;
- CLIENT_SendRequest( REQ_EVENT_OP, -1, 1, &req, sizeof(req) );
- return !CLIENT_WaitReply( NULL, NULL, 0 );
- }
- event->signaled = TRUE;
- SYNC_WakeUp( &event->wait_queue, event->manual_reset ? INFINITE32 : 1 );
- K32OBJ_DecCount( &event->header );
- SYSTEM_UNLOCK();
- return TRUE;
+ return EVENT_Operation( handle, SET_EVENT );
}
@@ -234,79 +168,7 @@
*/
BOOL32 WINAPI ResetEvent( HANDLE32 handle )
{
- struct event_op_request req;
- EVENT *event;
- SYSTEM_LOCK();
- if (!(event = (EVENT *)HANDLE_GetObjPtr(PROCESS_Current(), handle,
- K32OBJ_EVENT, EVENT_MODIFY_STATE,
- &req.handle )))
- {
- SYSTEM_UNLOCK();
- return FALSE;
- }
- if (req.handle != -1)
- {
- SYSTEM_UNLOCK();
- req.op = RESET_EVENT;
- CLIENT_SendRequest( REQ_EVENT_OP, -1, 1, &req, sizeof(req) );
- return !CLIENT_WaitReply( NULL, NULL, 0 );
- }
- event->signaled = FALSE;
- K32OBJ_DecCount( &event->header );
- SYSTEM_UNLOCK();
- return TRUE;
-}
-
-
-/***********************************************************************
- * EVENT_Signaled
- */
-static BOOL32 EVENT_Signaled( K32OBJ *obj, DWORD thread_id )
-{
- EVENT *event = (EVENT *)obj;
- assert( obj->type == K32OBJ_EVENT );
- return event->signaled;
-}
-
-
-/***********************************************************************
- * EVENT_Satisfied
- *
- * Wait on this object has been satisfied.
- */
-static BOOL32 EVENT_Satisfied( K32OBJ *obj, DWORD thread_id )
-{
- EVENT *event = (EVENT *)obj;
- assert( obj->type == K32OBJ_EVENT );
- /* Reset if it's an auto-reset event */
- if (!event->manual_reset) event->signaled = FALSE;
- return FALSE; /* Not abandoned */
-}
-
-
-/***********************************************************************
- * EVENT_AddWait
- *
- * Add thread to object wait queue.
- */
-static void EVENT_AddWait( K32OBJ *obj, DWORD thread_id )
-{
- EVENT *event = (EVENT *)obj;
- assert( obj->type == K32OBJ_EVENT );
- THREAD_AddQueue( &event->wait_queue, THREAD_ID_TO_THDB(thread_id) );
-}
-
-
-/***********************************************************************
- * EVENT_RemoveWait
- *
- * Remove thread from object wait queue.
- */
-static void EVENT_RemoveWait( K32OBJ *obj, DWORD thread_id )
-{
- EVENT *event = (EVENT *)obj;
- assert( obj->type == K32OBJ_EVENT );
- THREAD_RemoveQueue( &event->wait_queue, THREAD_ID_TO_THDB(thread_id) );
+ return EVENT_Operation( handle, RESET_EVENT );
}
@@ -317,8 +179,6 @@
{
EVENT *event = (EVENT *)obj;
assert( obj->type == K32OBJ_EVENT );
- /* There cannot be any thread on the list since the ref count is 0 */
- assert( event->wait_queue == NULL );
obj->type = K32OBJ_UNKNOWN;
HeapFree( SystemHeap, 0, event );
}