Andrew Cook : server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 17 08:03:40 CDT 2015


Module: wine
Branch: master
Commit: 453458f2946edeb4744d40ca6e80a49947cf221b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=453458f2946edeb4744d40ca6e80a49947cf221b

Author: Andrew Cook <ariscop at 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;




More information about the wine-cvs mailing list