From: Rémi Bernon rbernon@codeweavers.com
--- server/process.c | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-)
diff --git a/server/process.c b/server/process.c index eac2df227c9..85e50d8b63b 100644 --- a/server/process.c +++ b/server/process.c @@ -144,6 +144,7 @@ static const struct fd_ops process_fd_ops = struct startup_info { struct object obj; /* object header */ + struct event *sync; /* event object as sync */ struct process *process; /* created process */ data_size_t info_size; /* size of startup info */ data_size_t data_size; /* size of whole startup data */ @@ -152,18 +153,8 @@ struct startup_info
static void startup_info_dump( struct object *obj, int verbose ); static struct sync *startup_info_get_sync( struct object *obj ); -static int startup_info_signaled( struct object *obj, struct wait_queue_entry *entry ); static void startup_info_destroy( struct object *obj );
-static const struct sync_ops startup_info_sync_ops = -{ - add_queue, /* add_queue */ - remove_queue, /* remove_queue */ - startup_info_signaled, /* signaled */ - no_satisfied, /* satisfied */ - no_signal, /* signal */ -}; - static const struct object_ops startup_info_ops = { sizeof(struct startup_info), /* size */ @@ -577,7 +568,7 @@ static void set_process_startup_state( struct process *process, enum startup_sta if (process->startup_state == STARTUP_IN_PROGRESS) process->startup_state = state; if (process->startup_info) { - wake_up( &process->startup_info->obj, 0 ); + set_event( process->startup_info->sync ); release_object( process->startup_info ); process->startup_info = NULL; } @@ -905,6 +896,7 @@ static void startup_info_destroy( struct object *obj ) assert( obj->ops == &startup_info_ops ); free( info->data ); if (info->process) release_object( info->process ); + release_object( info->sync ); }
static void startup_info_dump( struct object *obj, int verbose ) @@ -923,13 +915,7 @@ static struct sync *startup_info_get_sync( struct object *obj ) { struct startup_info *info = (struct startup_info *)obj; assert( obj->ops == &startup_info_ops ); - return &info->obj.sync; -} - -static int startup_info_signaled( struct object *obj, struct wait_queue_entry *entry ) -{ - struct startup_info *info = (struct startup_info *)obj; - return info->process && info->process->startup_state != STARTUP_IN_PROGRESS; + return get_event_sync( info->sync ); }
/* get a process from an id (and increment the refcount) */ @@ -1240,7 +1226,7 @@ DECL_HANDLER(new_process) release_object( parent ); return; } - info->obj.sync.ops = &startup_info_sync_ops; + info->sync = create_event_sync( 1, 0 ); info->process = NULL; info->data = NULL;