Revision: 23696 http://trac.macosforge.org/projects/launchd/changeset/23696 Author: dsorresso@apple.com Date: 2008-08-22 15:48:58 -0700 (Fri, 22 Aug 2008) Log Message: ----------- Merging in changes for rdar://problem/6003804 Modified Paths: -------------- trunk/launchd/src/launchd_internal.defs trunk/launchd/src/launchd_runtime.c Modified: trunk/launchd/src/launchd_internal.defs =================================================================== --- trunk/launchd/src/launchd_internal.defs 2008-08-22 22:42:13 UTC (rev 23695) +++ trunk/launchd/src/launchd_internal.defs 2008-08-22 22:48:58 UTC (rev 23696) @@ -28,6 +28,3 @@ routine handle_kqueue( __port : mach_port_t; __fd : integer_t); - -routine handle_mport( - __port : mach_port_t); Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2008-08-22 22:42:13 UTC (rev 23695) +++ trunk/launchd/src/launchd_runtime.c 2008-08-22 22:48:58 UTC (rev 23696) @@ -86,9 +86,9 @@ static int bulk_kev_cnt; static pthread_t kqueue_demand_thread; -static pthread_t demand_thread; -static void *mport_demand_loop(void *arg); +static void mportset_callback(void); +static kq_callback kqmportset_callback = (kq_callback)mportset_callback; static void *kqueue_demand_loop(void *arg); static void log_kevent_struct(int level, struct kevent *kev_base, int indx); @@ -155,6 +155,8 @@ launchd_assert((errno = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &demand_port_set)) == KERN_SUCCESS); launchd_assert((errno = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &ipc_port_set)) == KERN_SUCCESS); + launchd_assert(kevent_mod(demand_port_set, EVFILT_MACHPORT, EV_ADD, 0, 0, &kqmportset_callback) != -1); + launchd_assert(launchd_mport_create_recv(&launchd_internal_port) == KERN_SUCCESS); launchd_assert(launchd_mport_make_send(launchd_internal_port) == KERN_SUCCESS); @@ -172,12 +174,6 @@ launchd_assert(pthread_create(&kqueue_demand_thread, &attr, kqueue_demand_loop, NULL) == 0); pthread_attr_destroy(&attr); - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); - launchd_assert(pthread_create(&demand_thread, &attr, mport_demand_loop, NULL) == 0); - pthread_attr_destroy(&attr); - launchd_assumes(sysctlbyname("vfs.generic.noremotehang", NULL, NULL, &p, sizeof(p)) != -1); } @@ -192,25 +188,6 @@ } } -void * -mport_demand_loop(void *arg __attribute__((unused))) -{ - mach_msg_empty_rcv_t dummy; - kern_return_t kr; - - for (;;) { - kr = mach_msg(&dummy.header, MACH_RCV_MSG|MACH_RCV_LARGE, 0, 0, demand_port_set, 0, MACH_PORT_NULL); - if (unlikely(kr == MACH_RCV_PORT_CHANGED)) { - break; - } else if (!launchd_assumes(kr == MACH_RCV_TOO_LARGE)) { - continue; - } - launchd_assumes(handle_mport(launchd_internal_port) == 0); - } - - return NULL; -} - INTERNAL_ABI const char * proc_flags_to_C_names(unsigned int flags) { @@ -531,8 +508,8 @@ indx, kev->udata, kev->data, ident_buf, filter_str, flags_buf, fflags_buf); } -kern_return_t -x_handle_mport(mach_port_t junk __attribute__((unused))) +void +mportset_callback(void) { mach_port_name_array_t members; mach_msg_type_number_t membersCnt; @@ -542,7 +519,7 @@ unsigned int i; if (!launchd_assumes((errno = mach_port_get_set_status(mach_task_self(), demand_port_set, &members, &membersCnt)) == KERN_SUCCESS)) { - return 1; + return; } for (i = 0; i < membersCnt; i++) { @@ -570,8 +547,6 @@ launchd_assumes(vm_deallocate(mach_task_self(), (vm_address_t)members, (vm_size_t) membersCnt * sizeof(mach_port_name_t)) == KERN_SUCCESS); - - return 0; } void *
participants (1)
-
source_changes@macosforge.org