Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_sem.c
Show First 20 Lines • Show All 839 Lines • ▼ Show 20 Lines | while (ks->ks_value == 0) { | ||||
if (tryflag != 0) | if (tryflag != 0) | ||||
error = EAGAIN; | error = EAGAIN; | ||||
else if (abstime == NULL) | else if (abstime == NULL) | ||||
error = cv_wait_sig(&ks->ks_cv, &sem_lock); | error = cv_wait_sig(&ks->ks_cv, &sem_lock); | ||||
else { | else { | ||||
for (;;) { | for (;;) { | ||||
ts1 = *abstime; | ts1 = *abstime; | ||||
getnanotime(&ts2); | getnanotime(&ts2); | ||||
timespecsub(&ts1, &ts2); | timespecsub(&ts1, &ts2, &ts1); | ||||
TIMESPEC_TO_TIMEVAL(&tv, &ts1); | TIMESPEC_TO_TIMEVAL(&tv, &ts1); | ||||
if (tv.tv_sec < 0) { | if (tv.tv_sec < 0) { | ||||
error = ETIMEDOUT; | error = ETIMEDOUT; | ||||
break; | break; | ||||
} | } | ||||
error = cv_timedwait_sig(&ks->ks_cv, | error = cv_timedwait_sig(&ks->ks_cv, | ||||
&sem_lock, tvtohz(&tv)); | &sem_lock, tvtohz(&tv)); | ||||
if (error != EWOULDBLOCK) | if (error != EWOULDBLOCK) | ||||
▲ Show 20 Lines • Show All 257 Lines • Show Last 20 Lines |