void (*caller_cont)(kern_return_t))
{
void (*continuation)(void);
- uint64_t abstime, nsinterval;
+ uint64_t abstime;
boolean_t nonblocking;
int wait_result;
spl_t spl_level;
kr = KERN_SUCCESS;
} else if (nonblocking) {
kr = KERN_OPERATION_TIMED_OUT;
- } else {
+ } else {
+ thread_t self = current_thread();
+
wait_semaphore->count = -1; /* we don't keep an actual count */
+ thread_lock(self);
(void)wait_queue_assert_wait64_locked(
&wait_semaphore->wait_queue,
SEMAPHORE_EVENT,
THREAD_ABORTSAFE,
- FALSE); /* unlock? */
+ self);
+ thread_unlock(self);
}
semaphore_unlock(wait_semaphore);
splx(spl_level);
* If it is a timed wait, go ahead and set up the timer.
*/
if (wait_timep != (mach_timespec_t *)0) {
- clock_interval_to_absolutetime_interval(wait_timep->tv_sec,
- NSEC_PER_SEC,
- &abstime);
- clock_interval_to_absolutetime_interval(wait_timep->tv_nsec,
- 1,
- &nsinterval);
- abstime += nsinterval;
+ nanoseconds_to_absolutetime((uint64_t)wait_timep->tv_sec *
+ NSEC_PER_SEC + wait_timep->tv_nsec, &abstime);
clock_absolutetime_interval_to_deadline(abstime, &abstime);
thread_set_timer_deadline(abstime);
continuation = semaphore_timedwait_continue;