Revision: 23699 http://trac.macosforge.org/projects/launchd/changeset/23699 Author: dsorresso@apple.com Date: 2008-08-25 14:11:07 -0700 (Mon, 25 Aug 2008) Log Message: ----------- Backing out change for rdar://problem/6003804, which caused rdar://problem/6173994. Will re-integrate once rdar://problem/6006324 is fixed. 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 23:01:23 UTC (rev 23698) +++ trunk/launchd/src/launchd_internal.defs 2008-08-25 21:11:07 UTC (rev 23699) @@ -28,3 +28,6 @@ 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 23:01:23 UTC (rev 23698) +++ trunk/launchd/src/launchd_runtime.c 2008-08-25 21:11:07 UTC (rev 23699) @@ -86,9 +86,9 @@ static int bulk_kev_cnt; static pthread_t kqueue_demand_thread; +static pthread_t demand_thread; -static void mportset_callback(void); -static kq_callback kqmportset_callback = (kq_callback)mportset_callback; +static void *mport_demand_loop(void *arg); static void *kqueue_demand_loop(void *arg); static void log_kevent_struct(int level, struct kevent *kev_base, int indx); @@ -155,8 +155,6 @@ 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); @@ -174,6 +172,12 @@ 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); } @@ -188,6 +192,25 @@ } } +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) { @@ -508,8 +531,8 @@ indx, kev->udata, kev->data, ident_buf, filter_str, flags_buf, fflags_buf); } -void -mportset_callback(void) +kern_return_t +x_handle_mport(mach_port_t junk __attribute__((unused))) { mach_port_name_array_t members; mach_msg_type_number_t membersCnt; @@ -519,7 +542,7 @@ unsigned int i; if (!launchd_assumes((errno = mach_port_get_set_status(mach_task_self(), demand_port_set, &members, &membersCnt)) == KERN_SUCCESS)) { - return; + return 1; } for (i = 0; i < membersCnt; i++) { @@ -547,6 +570,8 @@ 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