Module: wine Branch: master Commit: 453458f2946edeb4744d40ca6e80a49947cf221b URL: http://source.winehq.org/git/wine.git/?a=commit;h=453458f2946edeb4744d40ca6e...
Author: Andrew Cook ariscop@gmail.com Date: Fri Jul 17 06:17:08 2015 +0200
server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.
---
dlls/kernel32/tests/process.c | 1 - server/process.c | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 4145dce..9f62e13 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -2452,7 +2452,6 @@ static void test_KillOnJobClose(void) CloseHandle(job);
dwret = WaitForSingleObject(pi.hProcess, 1000); - todo_wine ok(dwret == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", dwret); if (dwret == WAIT_TIMEOUT) TerminateProcess(pi.hProcess, 0);
diff --git a/server/process.c b/server/process.c index 569a8fe..0bf7194 100644 --- a/server/process.c +++ b/server/process.c @@ -140,6 +140,7 @@ static void job_dump( struct object *obj, int verbose ); static struct object_type *job_get_type( struct object *obj ); static int job_signaled( struct object *obj, struct wait_queue_entry *entry ); static unsigned int job_map_access( struct object *obj, unsigned int access ); +static int job_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); static void job_destroy( struct object *obj );
struct job @@ -170,7 +171,7 @@ static const struct object_ops job_ops = default_set_sd, /* set_sd */ no_lookup_name, /* lookup_name */ no_open_file, /* open_file */ - no_close_handle, /* close_handle */ + job_close_handle, /* close_handle */ job_destroy /* destroy */ };
@@ -287,6 +288,19 @@ static void terminate_job( struct job *job, int exit_code ) wake_up( &job->obj, 0 ); }
+static int job_close_handle( struct object *obj, struct process *process, obj_handle_t handle ) +{ + struct job *job = (struct job *)obj; + assert( obj->ops == &job_ops ); + + if (obj->handle_count == 1) /* last handle */ + { + if (job->limit_flags & JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE) + terminate_job( job, 0 ); + } + return 1; +} + static void job_destroy( struct object *obj ) { struct job *job = (struct job *)obj;