From 22495036a354e209a7f2085bdd2e1fc82895208b Mon Sep 17 00:00:00 2001 From: Richard Braun Date: Sun, 24 Nov 2013 11:17:54 +0100 Subject: New RPC for thread destruction A new call, thread_terminate_release, is added to support self destruction in threading libraries. * include/mach/gnumach.defs (thread_terminate_release): New simpleroutine declaration. * kern/thread.c: Include vm/vm_user.h and ipc/mach_port.h. (thread_terminate_release): New function. * kern/thread.h (thread_terminate_release): New prototype. --- kern/thread.c | 24 ++++++++++++++++++++++++ kern/thread.h | 7 +++++++ 2 files changed, 31 insertions(+) (limited to 'kern') diff --git a/kern/thread.c b/kern/thread.c index eb8a8bb..67fd41e 100644 --- a/kern/thread.c +++ b/kern/thread.c @@ -57,9 +57,11 @@ #include #include #include +#include #include #include #include +#include #include /* for splsched */ #include #include /* for MACHINE_STACK */ @@ -850,6 +852,28 @@ kern_return_t thread_terminate( return KERN_SUCCESS; } +kern_return_t thread_terminate_release( + thread_t thread, + task_t task, + mach_port_t thread_name, + mach_port_t reply_port, + vm_offset_t address, + vm_size_t size) +{ + if (task == NULL) + return KERN_INVALID_ARGUMENT; + + mach_port_deallocate(task->itk_space, thread_name); + + if (reply_port != MACH_PORT_NULL) + mach_port_destroy(task->itk_space, reply_port); + + if ((address != 0) || (size != 0)) + vm_deallocate(task->map, address, size); + + return thread_terminate(thread); +} + /* * thread_force_terminate: * diff --git a/kern/thread.h b/kern/thread.h index 3959dfc..beb2dbc 100644 --- a/kern/thread.h +++ b/kern/thread.h @@ -259,6 +259,13 @@ extern kern_return_t thread_create( thread_t *child_thread); extern kern_return_t thread_terminate( thread_t thread); +extern kern_return_t thread_terminate_release( + thread_t thread, + task_t task, + mach_port_t thread_name, + mach_port_t reply_port, + vm_offset_t address, + vm_size_t size); extern kern_return_t thread_suspend( thread_t thread); extern kern_return_t thread_resume( -- cgit v1.2.3