server: Implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE.
This commit is contained in:
parent
7d3f13a129
commit
453458f294
|
@ -2452,7 +2452,6 @@ static void test_KillOnJobClose(void)
|
||||||
CloseHandle(job);
|
CloseHandle(job);
|
||||||
|
|
||||||
dwret = WaitForSingleObject(pi.hProcess, 1000);
|
dwret = WaitForSingleObject(pi.hProcess, 1000);
|
||||||
todo_wine
|
|
||||||
ok(dwret == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", dwret);
|
ok(dwret == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", dwret);
|
||||||
if (dwret == WAIT_TIMEOUT) TerminateProcess(pi.hProcess, 0);
|
if (dwret == WAIT_TIMEOUT) TerminateProcess(pi.hProcess, 0);
|
||||||
|
|
||||||
|
|
|
@ -140,6 +140,7 @@ static void job_dump( struct object *obj, int verbose );
|
||||||
static struct object_type *job_get_type( struct object *obj );
|
static struct object_type *job_get_type( struct object *obj );
|
||||||
static int job_signaled( struct object *obj, struct wait_queue_entry *entry );
|
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 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 );
|
static void job_destroy( struct object *obj );
|
||||||
|
|
||||||
struct job
|
struct job
|
||||||
|
@ -170,7 +171,7 @@ static const struct object_ops job_ops =
|
||||||
default_set_sd, /* set_sd */
|
default_set_sd, /* set_sd */
|
||||||
no_lookup_name, /* lookup_name */
|
no_lookup_name, /* lookup_name */
|
||||||
no_open_file, /* open_file */
|
no_open_file, /* open_file */
|
||||||
no_close_handle, /* close_handle */
|
job_close_handle, /* close_handle */
|
||||||
job_destroy /* destroy */
|
job_destroy /* destroy */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -287,6 +288,19 @@ static void terminate_job( struct job *job, int exit_code )
|
||||||
wake_up( &job->obj, 0 );
|
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 )
|
static void job_destroy( struct object *obj )
|
||||||
{
|
{
|
||||||
struct job *job = (struct job *)obj;
|
struct job *job = (struct job *)obj;
|
||||||
|
|
Loading…
Reference in New Issue