kern_return_t semaphore_timedwait_signal_trap_internal( mach_port_name_t wait_name, mach_port_name_t signal_name, unsigned int sec, clock_res_t nsec, void (*caller_cont)(kern_return_t)) { semaphore_t wait_semaphore; semaphore_t signal_semaphore; mach_timespec_t wait_time; kern_return_t kr; wait_time.tv_sec = sec; wait_time.tv_nsec = nsec; if(BAD_MACH_TIMESPEC(&wait_time)) return KERN_INVALID_VALUE; kr = port_name_to_semaphore(signal_name, &signal_semaphore); if (kr == KERN_SUCCESS) { kr = port_name_to_semaphore(wait_name, &wait_semaphore); if (kr == KERN_SUCCESS) { kr = semaphore_wait_internal(wait_semaphore, signal_semaphore, &wait_time, caller_cont); semaphore_dereference(wait_semaphore); } semaphore_dereference(signal_semaphore); } return kr; }
/* * Routine: semaphore_signal_thread_trap * * Trap interface to the semaphore_signal_thread function. */ kern_return_t semaphore_signal_thread_trap( struct semaphore_signal_thread_trap_args *args) { mach_port_name_t sema_name = args->signal_name; mach_port_name_t thread_name = args->thread_name; semaphore_t semaphore; thread_t thread; kern_return_t kr; /* * MACH_PORT_NULL is not an error. It means that we want to * select any one thread that is already waiting, but not to * pre-post the semaphore. */ if (thread_name != MACH_PORT_NULL) { thread = port_name_to_thread(thread_name); if (thread == THREAD_NULL) return KERN_INVALID_ARGUMENT; } else thread = THREAD_NULL; kr = port_name_to_semaphore(sema_name, &semaphore); if (kr == KERN_SUCCESS) { kr = semaphore_signal_internal(semaphore, thread, SEMAPHORE_OPTION_NONE); semaphore_dereference(semaphore); } if (thread != THREAD_NULL) { thread_deallocate(thread); } return kr; }
kern_return_t semaphore_timedwait_trap_internal( mach_port_name_t name, unsigned int sec, clock_res_t nsec, void (*caller_cont)(kern_return_t)) { semaphore_t semaphore; mach_timespec_t wait_time; kern_return_t kr; wait_time.tv_sec = sec; wait_time.tv_nsec = nsec; if(BAD_MACH_TIMESPEC(&wait_time)) return KERN_INVALID_VALUE; kr = port_name_to_semaphore(name, &semaphore); if (kr == KERN_SUCCESS) { int option = SEMAPHORE_OPTION_NONE; uint64_t deadline = 0; if (sec == 0 && nsec == 0) option = SEMAPHORE_TIMEOUT_NOBLOCK; else deadline = semaphore_deadline(sec, nsec); kr = semaphore_wait_internal(semaphore, SEMAPHORE_NULL, deadline, option, caller_cont); semaphore_dereference(semaphore); } return kr; }
kern_return_t semaphore_wait_signal_trap_internal( mach_port_name_t wait_name, mach_port_name_t signal_name, void (*caller_cont)(kern_return_t)) { semaphore_t wait_semaphore; semaphore_t signal_semaphore; kern_return_t kr; kr = port_name_to_semaphore(signal_name, &signal_semaphore); if (kr == KERN_SUCCESS) { kr = port_name_to_semaphore(wait_name, &wait_semaphore); if (kr == KERN_SUCCESS) { kr = semaphore_wait_internal(wait_semaphore, signal_semaphore, (mach_timespec_t *)0, caller_cont); semaphore_dereference(wait_semaphore); } semaphore_dereference(signal_semaphore); } return kr; }
kern_return_t semaphore_wait_signal_trap_internal( mach_port_name_t wait_name, mach_port_name_t signal_name, void (*caller_cont)(kern_return_t)) { semaphore_t wait_semaphore; semaphore_t signal_semaphore; kern_return_t kr; kr = port_name_to_semaphore(signal_name, &signal_semaphore); if (kr == KERN_SUCCESS) { kr = port_name_to_semaphore(wait_name, &wait_semaphore); if (kr == KERN_SUCCESS) { kr = semaphore_wait_internal(wait_semaphore, signal_semaphore, 0ULL, SEMAPHORE_OPTION_NONE, caller_cont); semaphore_dereference(wait_semaphore); } semaphore_dereference(signal_semaphore); } return kr; }
kern_return_t semaphore_signal_internal_trap(mach_port_name_t sema_name) { semaphore_t semaphore; kern_return_t kr; kr = port_name_to_semaphore(sema_name, &semaphore); if (kr == KERN_SUCCESS) { kr = semaphore_signal_internal(semaphore, THREAD_NULL, SEMAPHORE_SIGNAL_PREPOST); semaphore_dereference(semaphore); if (kr == KERN_NOT_WAITING) kr = KERN_SUCCESS; } return kr; }
kern_return_t semaphore_wait_trap_internal( mach_port_name_t name, void (*caller_cont)(kern_return_t)) { semaphore_t semaphore; kern_return_t kr; kr = port_name_to_semaphore(name, &semaphore); if (kr == KERN_SUCCESS) { kr = semaphore_wait_internal(semaphore, SEMAPHORE_NULL, (mach_timespec_t *)0, caller_cont); semaphore_dereference(semaphore); } return kr; }
/* * Routine: semaphore_signal_all_trap * * Trap interface to the semaphore_signal_all function. */ kern_return_t semaphore_signal_all_trap( struct semaphore_signal_all_trap_args *args) { mach_port_name_t sema_name = args->signal_name; semaphore_t semaphore; kern_return_t kr; kr = port_name_to_semaphore(sema_name, &semaphore); if (kr == KERN_SUCCESS) { kr = semaphore_signal_internal(semaphore, THREAD_NULL, SEMAPHORE_SIGNAL_ALL); semaphore_dereference(semaphore); if (kr == KERN_NOT_WAITING) kr = KERN_SUCCESS; } return kr; }