]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/sync_sema.c
xnu-517.9.4.tar.gz
[apple/xnu.git] / osfmk / kern / sync_sema.c
index 34618b4b5e6be305c8e39420324e7a56deaf5d1a..a112422a4afe0baa2e6addae7afd071d1ed7a188 100644 (file)
@@ -557,7 +557,7 @@ semaphore_wait_internal(
        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;
@@ -580,13 +580,17 @@ semaphore_wait_internal(
                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);
@@ -643,13 +647,8 @@ semaphore_wait_internal(
         * 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;