Rebase against a90592c8d29d3b145eada90c297405cbd8a9277f.

This commit is contained in:
Sebastian Lackner
2015-07-17 16:00:07 +02:00
parent 36e9309497
commit a37730ab0e
17 changed files with 70 additions and 1385 deletions

View File

@@ -1,67 +0,0 @@
From 23d528b7e744e69fa5d857be20f188ce5510c088 Mon Sep 17 00:00:00 2001
From: Andrew Cook <ariscop@gmail.com>
Date: Thu, 26 Feb 2015 13:10:41 +1100
Subject: server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.
---
dlls/kernel32/tests/process.c | 1 -
server/process.c | 17 ++++++++++++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index c63d6b1..5e04836 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2435,7 +2435,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..38bd977 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 *, 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,20 @@ 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 this is the last handle and JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE is set,
+ * then terminate all associcated processes. We can't use the refcount because
+ * processes have a reference to the job object. */
+ if (obj->handle_count == 1 && (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.3.5