From: Elizabeth Figura zfigura@codeweavers.com
--- server/process.c | 54 +++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 23 deletions(-)
diff --git a/server/process.c b/server/process.c index b169b412253..592bc5f3d9e 100644 --- a/server/process.c +++ b/server/process.c @@ -192,24 +192,24 @@ struct type_descr job_type = };
static void job_dump( struct object *obj, int verbose ); -static int job_signaled( struct object *obj, struct wait_queue_entry *entry ); +static struct object *job_get_sync( struct object *obj ); static int job_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); static void job_destroy( struct object *obj );
struct job { - struct object obj; /* object header */ - struct list process_list; /* list of processes */ - int num_processes; /* count of running processes */ - int total_processes; /* count of processes which have been assigned */ - unsigned int limit_flags; /* limit flags */ - int terminating; /* job is terminating */ - int signaled; /* job is signaled */ - struct completion *completion_port; /* associated completion port */ - apc_param_t completion_key; /* key to send with completion messages */ - struct job *parent; - struct list parent_job_entry; /* list entry for parent job */ - struct list child_job_list; /* list of child jobs */ + struct object obj; /* object header */ + struct event_sync *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 */ + unsigned int limit_flags; /* limit flags */ + int terminating; /* job is terminating */ + struct completion *completion_port; /* associated completion port */ + apc_param_t completion_key; /* key to send with completion messages */ + struct job *parent; + struct list parent_job_entry; /* list entry for parent job */ + struct list child_job_list; /* list of child jobs */ };
static const struct object_ops job_ops = @@ -217,13 +217,13 @@ static const struct object_ops job_ops = sizeof(struct job), /* size */ &job_type, /* type */ job_dump, /* dump */ - add_queue, /* add_queue */ - remove_queue, /* remove_queue */ - job_signaled, /* signaled */ - no_satisfied, /* satisfied */ + NULL, /* add_queue */ + NULL, /* remove_queue */ + NULL, /* signaled */ + NULL, /* satisfied */ no_signal, /* signal */ no_get_fd, /* get_fd */ - default_get_sync, /* get_sync */ + job_get_sync, /* get_sync */ default_map_access, /* map_access */ default_get_sd, /* get_sd */ default_set_sd, /* set_sd */ @@ -247,16 +247,22 @@ static struct job *create_job_object( struct object *root, const struct unicode_ if (get_error() != STATUS_OBJECT_NAME_EXISTS) { /* initialize it if it didn't already exist */ + job->sync = NULL; list_init( &job->process_list ); list_init( &job->child_job_list ); job->num_processes = 0; job->total_processes = 0; job->limit_flags = 0; job->terminating = 0; - job->signaled = 0; job->completion_port = NULL; job->completion_key = 0; job->parent = NULL; + + if (!(job->sync = create_event_sync( 1, 0 ))) + { + release_object( job ); + return NULL; + } } } return job; @@ -411,8 +417,7 @@ static void terminate_job( struct job *job, int exit_code ) if (process->running_threads) terminate_process( process, NULL, exit_code ); } job->terminating = 0; - job->signaled = 1; - wake_up( &job->obj, 0 ); + signal_sync( job->sync ); }
static int job_close_handle( struct object *obj, struct process *process, obj_handle_t handle ) @@ -443,6 +448,8 @@ static void job_destroy( struct object *obj ) list_remove( &job->parent_job_entry ); release_object( job->parent ); } + + if (job->sync) release_object( job->sync ); }
static void job_dump( struct object *obj, int verbose ) @@ -453,10 +460,11 @@ static void job_dump( struct object *obj, int verbose ) list_count(&job->process_list), list_count(&job->child_job_list), job->parent ); }
-static int job_signaled( struct object *obj, struct wait_queue_entry *entry ) +static struct object *job_get_sync( struct object *obj ) { struct job *job = (struct job *)obj; - return job->signaled; + assert( obj->ops == &job_ops ); + return grab_object( job->sync ); }
struct ptid_entry