server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.

Sebastian Lackner sebastian at fds-team.de
Thu Jul 16 23:17:08 CDT 2015


From: Andrew Cook <ariscop at gmail.com>

This patch was still missing to complete the series. ;)

---
 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;
-- 
2.4.5



More information about the wine-patches mailing list