From: Rémi Bernon rbernon@codeweavers.com
--- server/completion.c | 2 +- server/console.c | 16 ++++++++-------- server/debugger.c | 12 ++++++------ server/device.c | 2 +- server/event.c | 38 +++++++++++++++++--------------------- server/fd.c | 4 ++-- server/mutex.c | 28 +++++++++++++++++----------- server/object.h | 8 ++++---- server/process.c | 4 ++-- server/process.h | 2 +- server/queue.c | 2 +- server/semaphore.c | 24 +++++++++++++++--------- server/thread.c | 14 ++++++++++++-- server/thread.h | 2 +- server/timer.c | 2 +- 15 files changed, 89 insertions(+), 71 deletions(-)
diff --git a/server/completion.c b/server/completion.c index caef8fba2a8..dbcf4e2480c 100644 --- a/server/completion.c +++ b/server/completion.c @@ -73,7 +73,7 @@ struct completion_wait struct completion { struct object obj; - struct event_sync *sync; + struct object *sync; struct list queue; struct list wait_queue; unsigned int depth; diff --git a/server/console.c b/server/console.c index 08bad277a3f..eb849b7d239 100644 --- a/server/console.c +++ b/server/console.c @@ -53,7 +53,7 @@ struct history_line struct console { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct thread *renderer; /* console renderer thread */ struct screen_buffer *active; /* active screen buffer */ struct console_server *server; /* console server object */ @@ -134,7 +134,7 @@ struct console_host_ioctl struct console_server { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct fd *fd; /* pseudo-fd for ioctls */ struct console *console; /* attached console */ struct list queue; /* ioctl queue */ @@ -210,7 +210,7 @@ struct font_info struct screen_buffer { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct list entry; /* entry in list of all screen buffers */ struct console *input; /* associated console input */ unsigned int id; /* buffer id */ @@ -303,7 +303,7 @@ static const struct object_ops console_device_ops = struct console_input { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct fd *fd; /* pseudo-fd */ struct list entry; /* entry in console->inputs */ struct console *console; /* associated console at creation time */ @@ -364,7 +364,7 @@ static const struct fd_ops console_input_fd_ops = struct console_output { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct fd *fd; /* pseudo-fd */ struct list entry; /* entry in console->outputs */ struct console *console; /* associated console at creation time */ @@ -646,7 +646,7 @@ static struct object *create_screen_buffer( struct console *console ) }
if (!(screen_buffer = alloc_object( &screen_buffer_ops ))) return NULL; - screen_buffer->sync = (struct event_sync *)grab_object( console->sync ); + screen_buffer->sync = grab_object( console->sync ); screen_buffer->id = ++console->last_id; screen_buffer->input = console; init_async_queue( &screen_buffer->ioctl_q ); @@ -1350,7 +1350,7 @@ static struct object *console_device_lookup_name( struct object *obj, struct uni
name->len = 0; if (!(console_input = alloc_object( &console_input_ops ))) return NULL; - console_input->sync = (struct event_sync *)grab_object( current->process->console->sync ); + console_input->sync = grab_object( current->process->console->sync ); console_input->fd = alloc_pseudo_fd( &console_input_fd_ops, &console_input->obj, FILE_SYNCHRONOUS_IO_NONALERT ); if (!console_input->fd) @@ -1375,7 +1375,7 @@ static struct object *console_device_lookup_name( struct object *obj, struct uni
name->len = 0; if (!(console_output = alloc_object( &console_output_ops ))) return NULL; - console_output->sync = (struct event_sync *)grab_object( current->process->console->sync ); + console_output->sync = grab_object( current->process->console->sync ); console_output->fd = alloc_pseudo_fd( &console_output_fd_ops, &console_output->obj, FILE_SYNCHRONOUS_IO_NONALERT ); if (!console_output->fd) diff --git a/server/debugger.c b/server/debugger.c index 094614a6a6a..c709e34078b 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -70,7 +70,7 @@ struct type_descr debug_obj_type = struct debug_obj { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct list event_queue; /* pending events queue */ unsigned int flags; /* debug flags */ }; @@ -265,7 +265,7 @@ static void link_event( struct debug_obj *debug_obj, struct debug_event *event ) static void resume_event( struct debug_obj *debug_obj, struct debug_event *event ) { event->state = EVENT_QUEUED; - reset_sync( event->sync ); + reset_sync( (struct object *)event->sync ); if (!event->sender->process->debug_event) { grab_object( debug_obj ); @@ -278,7 +278,7 @@ static void resume_event( struct debug_obj *debug_obj, struct debug_event *event static void delay_event( struct debug_obj *debug_obj, struct debug_event *event ) { event->state = EVENT_DELAYED; - reset_sync( event->sync ); + reset_sync( (struct object *)event->sync ); if (event->sender->process->debug_event == event) event->sender->process->debug_event = NULL; }
@@ -422,7 +422,7 @@ static int continue_debug_event( struct debug_obj *debug_obj, struct process *pr assert( event->sender->process->debug_event == event ); event->status = status; event->state = EVENT_CONTINUED; - signal_sync( event->sync ); + signal_sync( (struct object *)event->sync ); unlink_event( debug_obj, event ); resume_process( process ); return 1; @@ -543,7 +543,7 @@ void debugger_detach( struct process *process, struct debug_obj *debug_obj ) assert( event->state != EVENT_CONTINUED ); event->status = DBG_CONTINUE; event->state = EVENT_CONTINUED; - signal_sync( event->sync ); + signal_sync( (struct object *)event->sync ); unlink_event( debug_obj, event ); /* from queued debug event */ resume_process( process ); @@ -589,7 +589,7 @@ DECL_HANDLER(wait_debug_event) if ((event = find_event_to_send( debug_obj ))) { event->state = EVENT_SENT; - reset_sync( event->sync ); + reset_sync( (struct object *)event->sync ); event->sender->process->debug_event = event; reply->pid = get_process_id( event->sender->process ); reply->tid = get_thread_id( event->sender ); diff --git a/server/device.c b/server/device.c index 859ca9a2b52..3eed74343e5 100644 --- a/server/device.c +++ b/server/device.c @@ -89,7 +89,7 @@ static const struct object_ops irp_call_ops = struct device_manager { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct list devices; /* list of devices */ struct list requests; /* list of pending irps across all devices */ struct irp_call *current_call; /* call currently executed on client side */ diff --git a/server/event.c b/server/event.c index 3dc324df0ec..47a7d5a9b88 100644 --- a/server/event.c +++ b/server/event.c @@ -87,7 +87,7 @@ static const struct object_ops event_sync_ops = no_destroy /* destroy */ };
-static struct event_sync *create_event_sync( int manual, int signaled ) +static struct object *create_event_sync( int manual, int signaled ) { struct event_sync *event;
@@ -95,7 +95,7 @@ static struct event_sync *create_event_sync( int manual, int signaled ) event->manual = manual; event->signaled = signaled;
- return event; + return &event->obj; }
struct event_sync *create_server_internal_sync( int manual, int signaled ) @@ -109,9 +109,9 @@ struct event_sync *create_server_internal_sync( int manual, int signaled ) return event; }
-struct event_sync *create_internal_sync( int manual, int signaled ) +struct object *create_internal_sync( int manual, int signaled ) { - return create_event_sync( manual, signaled ); + return (struct object *)create_server_internal_sync( manual, signaled ); }
static void event_sync_dump( struct object *obj, int verbose ) @@ -129,16 +129,6 @@ static int event_sync_signaled( struct object *obj, struct wait_queue_entry *ent return event->signaled; }
-void signal_sync( struct event_sync *sync ) -{ - sync->obj.ops->signal( &sync->obj, 0, 1 ); -} - -void reset_sync( struct event_sync *sync ) -{ - sync->obj.ops->signal( &sync->obj, 0, 0 ); -} - static void event_sync_satisfied( struct object *obj, struct wait_queue_entry *entry ) { struct event_sync *event = (struct event_sync *)obj; @@ -160,7 +150,7 @@ static int event_sync_signal( struct object *obj, unsigned int access, int signa struct event { struct object obj; /* object header */ - struct event_sync *sync; /* event sync object */ + struct object *sync; /* event sync object */ struct list kernel_object; /* list of kernel object pointers */ };
@@ -287,7 +277,7 @@ static void event_dump( struct object *obj, int verbose ) { struct event *event = (struct event *)obj; assert( obj->ops == &event_ops ); - event->sync->obj.ops->dump( &event->sync->obj, verbose ); + event->sync->ops->dump( event->sync, verbose ); }
static struct object *event_get_sync( struct object *obj ) @@ -302,7 +292,7 @@ static int event_signal( struct object *obj, unsigned int access, int signal ) struct event *event = (struct event *)obj; assert( obj->ops == &event_ops );
- assert( event->sync->obj.ops == &event_sync_ops ); /* never called with inproc syncs */ + assert( event->sync->ops == &event_sync_ops ); /* never called with inproc syncs */ assert( signal == -1 ); /* always called from signal_object */
if (!(access & EVENT_MODIFY_STATE)) @@ -311,7 +301,7 @@ static int event_signal( struct object *obj, unsigned int access, int signal ) return 0; }
- return event_sync_signal( &event->sync->obj, 0, 1 ); + return event_sync_signal( event->sync, 0, 1 ); }
static struct list *event_get_kernel_obj_list( struct object *obj ) @@ -418,11 +408,14 @@ DECL_HANDLER(open_event) /* do an event operation */ DECL_HANDLER(event_op) { + struct event_sync *sync; struct event *event;
if (!(event = get_event_obj( current->process, req->handle, EVENT_MODIFY_STATE ))) return; + assert( event->sync->ops == &event_sync_ops ); /* never called with inproc syncs */ + sync = (struct event_sync *)event->sync;
- reply->state = event->sync->signaled; + reply->state = sync->signaled; switch(req->op) { case PULSE_EVENT: @@ -445,12 +438,15 @@ DECL_HANDLER(event_op) /* return details about the event */ DECL_HANDLER(query_event) { + struct event_sync *sync; struct event *event;
if (!(event = get_event_obj( current->process, req->handle, EVENT_QUERY_STATE ))) return; + assert( event->sync->ops == &event_sync_ops ); /* never called with inproc syncs */ + sync = (struct event_sync *)event->sync;
- reply->manual_reset = event->sync->manual; - reply->state = event->sync->signaled; + reply->manual_reset = sync->manual; + reply->state = sync->signaled;
release_object( event ); } diff --git a/server/fd.c b/server/fd.c index 5a43888e719..c4be028845f 100644 --- a/server/fd.c +++ b/server/fd.c @@ -129,7 +129,7 @@ struct fd { struct object obj; /* object header */ const struct fd_ops *fd_ops; /* file descriptor operations */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct inode *inode; /* inode that this fd belongs to */ struct list inode_entry; /* entry in inode fd list */ struct closed_fd *closed; /* structure to store the unix fd at destroy time */ @@ -273,7 +273,7 @@ static const struct object_ops inode_ops = struct file_lock { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct fd *fd; /* fd owning this lock */ struct list fd_entry; /* entry in list of locks on a given fd */ struct list inode_entry; /* entry in inode list of locks */ diff --git a/server/mutex.c b/server/mutex.c index 3fa8c021330..4932e07e96d 100644 --- a/server/mutex.c +++ b/server/mutex.c @@ -153,7 +153,7 @@ static void mutex_sync_satisfied( struct object *obj, struct wait_queue_entry *e mutex->abandoned = 0; }
-static struct mutex_sync *create_mutex_sync( int owned ) +static struct object *create_mutex_sync( int owned ) { struct mutex_sync *mutex;
@@ -163,13 +163,13 @@ static struct mutex_sync *create_mutex_sync( int owned ) mutex->abandoned = 0; if (owned) do_grab( mutex, current );
- return mutex; + return &mutex->obj; }
struct mutex { struct object obj; /* object header */ - struct mutex_sync *sync; /* mutex sync object */ + struct object *sync; /* mutex sync object */ };
static void mutex_dump( struct object *obj, int verbose ); @@ -241,7 +241,7 @@ static void mutex_dump( struct object *obj, int verbose ) { struct mutex *mutex = (struct mutex *)obj; assert( obj->ops == &mutex_ops ); - mutex->sync->obj.ops->dump( &mutex->sync->obj, verbose ); + mutex->sync->ops->dump( mutex->sync, verbose ); }
static struct object *mutex_get_sync( struct object *obj ) @@ -256,7 +256,7 @@ static int mutex_signal( struct object *obj, unsigned int access, int signal ) struct mutex *mutex = (struct mutex *)obj; assert( obj->ops == &mutex_ops );
- assert( mutex->sync->obj.ops == &mutex_sync_ops ); /* never called with inproc syncs */ + assert( mutex->sync->ops == &mutex_sync_ops ); /* never called with inproc syncs */ assert( signal == -1 ); /* always called from signal_object */
if (!(access & SYNCHRONIZE)) @@ -264,7 +264,7 @@ static int mutex_signal( struct object *obj, unsigned int access, int signal ) set_error( STATUS_ACCESS_DENIED ); return 0; } - return do_release( mutex->sync, current, 1 ); + return do_release( (struct mutex_sync *)mutex->sync, current, 1 ); }
static void mutex_destroy( struct object *obj ) @@ -315,8 +315,11 @@ DECL_HANDLER(release_mutex) if ((mutex = (struct mutex *)get_handle_obj( current->process, req->handle, 0, &mutex_ops ))) { - reply->prev_count = mutex->sync->count; - do_release( mutex->sync, current, 1 ); + struct mutex_sync *sync = (struct mutex_sync *)mutex->sync; + assert( mutex->sync->ops == &mutex_sync_ops ); /* never called with inproc syncs */ + + reply->prev_count = sync->count; + do_release( sync, current, 1 ); release_object( mutex ); } } @@ -329,9 +332,12 @@ DECL_HANDLER(query_mutex) if ((mutex = (struct mutex *)get_handle_obj( current->process, req->handle, MUTANT_QUERY_STATE, &mutex_ops ))) { - reply->count = mutex->sync->count; - reply->owned = (mutex->sync->owner == current); - reply->abandoned = mutex->sync->abandoned; + struct mutex_sync *sync = (struct mutex_sync *)mutex->sync; + assert( mutex->sync->ops == &mutex_sync_ops ); /* never called with inproc syncs */ + + reply->count = sync->count; + reply->owned = (sync->owner == current); + reply->abandoned = sync->abandoned;
release_object( mutex ); } diff --git a/server/object.h b/server/object.h index 4cc169b827c..939b18f0036 100644 --- a/server/object.h +++ b/server/object.h @@ -218,14 +218,14 @@ static inline void *mem_append( void *ptr, const void *src, data_size_t len )
/* event functions */
-struct event_sync; struct event; +struct event_sync; struct keyed_event;
extern struct event_sync *create_server_internal_sync( int manual, int signaled ); -extern struct event_sync *create_internal_sync( int manual, int signaled ); -extern void signal_sync( struct event_sync *sync ); -extern void reset_sync( struct event_sync *sync ); +extern struct object *create_internal_sync( int manual, int signaled ); +extern void signal_sync( struct object *sync ); +extern void reset_sync( struct object *sync );
extern struct event *create_event( struct object *root, const struct unicode_str *name, unsigned int attr, int manual_reset, int initial_state, diff --git a/server/process.c b/server/process.c index 48a1d2d697d..097125776b2 100644 --- a/server/process.c +++ b/server/process.c @@ -140,7 +140,7 @@ static const struct fd_ops process_fd_ops = struct startup_info { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct process *process; /* created process */ data_size_t info_size; /* size of startup info */ data_size_t data_size; /* size of whole startup data */ @@ -200,7 +200,7 @@ static void job_destroy( struct object *obj ); struct job { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct list process_list; /* list of processes */ int num_processes; /* count of running processes */ int total_processes; /* count of processes which have been assigned */ diff --git a/server/process.h b/server/process.h index 619e4894d1d..f7188627abc 100644 --- a/server/process.h +++ b/server/process.h @@ -36,7 +36,7 @@ enum startup_state { STARTUP_IN_PROGRESS, STARTUP_DONE, STARTUP_ABORTED }; struct process { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct list entry; /* entry in system-wide process list */ process_id_t parent_id; /* parent process id (at the time of creation) */ struct list thread_list; /* thread list */ diff --git a/server/queue.c b/server/queue.c index 4ccecc5c26a..fb9499b5589 100644 --- a/server/queue.c +++ b/server/queue.c @@ -120,7 +120,7 @@ struct msg_queue { struct object obj; /* object header */ struct fd *fd; /* optional file descriptor to poll */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ int paint_count; /* pending paint messages count */ int hotkey_count; /* pending hotkey messages count */ int quit_message; /* is there a pending quit message? */ diff --git a/server/semaphore.c b/server/semaphore.c index 771115e62fd..1b9109e1f98 100644 --- a/server/semaphore.c +++ b/server/semaphore.c @@ -130,20 +130,20 @@ static void semaphore_sync_satisfied( struct object *obj, struct wait_queue_entr sem->count--; }
-static struct semaphore_sync *create_semaphore_sync( unsigned int initial, unsigned int max ) +static struct object *create_semaphore_sync( unsigned int initial, unsigned int max ) { struct semaphore_sync *sem;
if (!(sem = alloc_object( &semaphore_sync_ops ))) return NULL; sem->count = initial; sem->max = max; - return sem; + return &sem->obj; }
struct semaphore { struct object obj; /* object header */ - struct semaphore_sync *sync; /* semaphore sync object */ + struct object *sync; /* semaphore sync object */ };
static void semaphore_dump( struct object *obj, int verbose ); @@ -208,7 +208,7 @@ static void semaphore_dump( struct object *obj, int verbose ) { struct semaphore *sem = (struct semaphore *)obj; assert( obj->ops == &semaphore_ops ); - sem->sync->obj.ops->dump( &sem->sync->obj, verbose ); + sem->sync->ops->dump( sem->sync, verbose ); }
static struct object *semaphore_get_sync( struct object *obj ) @@ -223,7 +223,7 @@ static int semaphore_signal( struct object *obj, unsigned int access, int signal struct semaphore *sem = (struct semaphore *)obj; assert( obj->ops == &semaphore_ops );
- assert( sem->sync->obj.ops == &semaphore_sync_ops ); /* never called with inproc syncs */ + assert( sem->sync->ops == &semaphore_sync_ops ); /* never called with inproc syncs */ assert( signal == -1 ); /* always called from signal_object */
if (!(access & SEMAPHORE_MODIFY_STATE)) @@ -231,7 +231,7 @@ static int semaphore_signal( struct object *obj, unsigned int access, int signal set_error( STATUS_ACCESS_DENIED ); return 0; } - return release_semaphore( sem->sync, 1, NULL ); + return release_semaphore( (struct semaphore_sync *)sem->sync, 1, NULL ); }
static void semaphore_destroy( struct object *obj ) @@ -282,7 +282,10 @@ DECL_HANDLER(release_semaphore) if ((sem = (struct semaphore *)get_handle_obj( current->process, req->handle, SEMAPHORE_MODIFY_STATE, &semaphore_ops ))) { - release_semaphore( sem->sync, req->count, &reply->prev_count ); + struct semaphore_sync *sync = (struct semaphore_sync *)sem->sync; + assert( sem->sync->ops == &semaphore_sync_ops ); /* never called with inproc syncs */ + + release_semaphore( sync, req->count, &reply->prev_count ); release_object( sem ); } } @@ -295,8 +298,11 @@ DECL_HANDLER(query_semaphore) if ((sem = (struct semaphore *)get_handle_obj( current->process, req->handle, SEMAPHORE_QUERY_STATE, &semaphore_ops ))) { - reply->current = sem->sync->count; - reply->max = sem->sync->max; + struct semaphore_sync *sync = (struct semaphore_sync *)sem->sync; + assert( sem->sync->ops == &semaphore_sync_ops ); /* never called with inproc syncs */ + + reply->current = sync->count; + reply->max = sync->max; release_object( sem ); } } diff --git a/server/thread.c b/server/thread.c index 83ee9a47794..b990907648f 100644 --- a/server/thread.c +++ b/server/thread.c @@ -85,7 +85,7 @@ struct thread_wait struct thread_apc { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct list entry; /* queue linked list */ struct thread *caller; /* thread that queued this apc */ struct object *owner; /* object that queued this apc */ @@ -131,7 +131,7 @@ static const struct object_ops thread_apc_ops = struct context { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ unsigned int status; /* status of the context */ struct context_data regs[2]; /* context data */ }; @@ -1031,6 +1031,16 @@ static int object_sync_signaled( struct object *obj, struct wait_queue_entry *en return ret; }
+void signal_sync( struct object *obj ) +{ + obj->ops->signal( obj, 0, 1 ); +} + +void reset_sync( struct object *obj ) +{ + obj->ops->signal( obj, 0, 0 ); +} + /* finish waiting */ static unsigned int end_wait( struct thread *thread, unsigned int status ) { diff --git a/server/thread.h b/server/thread.h index 9c552a88ed2..cbd13721083 100644 --- a/server/thread.h +++ b/server/thread.h @@ -50,7 +50,7 @@ struct inflight_fd struct thread { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ struct inproc_sync *alert_sync; /* inproc sync for user apc alerts */ struct list entry; /* entry in system-wide thread list */ struct list proc_entry; /* entry in per-process thread list */ diff --git a/server/timer.c b/server/timer.c index e8811594cac..a4309d54045 100644 --- a/server/timer.c +++ b/server/timer.c @@ -53,7 +53,7 @@ struct type_descr timer_type = struct timer { struct object obj; /* object header */ - struct event_sync *sync; /* sync object for wait/signal */ + struct object *sync; /* sync object for wait/signal */ int manual; /* manual reset */ int signaled; /* current signaled state */ unsigned int period; /* timer period in ms */