Enable cancellation point in sem_wait, it is required by POSIX.

For pshared semaphore, this commit still does not enable cancellation
point, I think there should be a pthread_enter_cancellation_point_np
for libc to implement a safe cancellation point.
This commit is contained in:
David Xu 2004-01-17 02:45:37 +00:00
parent 6c6b4e5dcd
commit cc3782cbc7

View File

@ -254,7 +254,19 @@ sem_unlink(const char *name)
return (ksem_unlink(name));
}
int
static void
decrease_nwaiters(void *arg)
{
sem_t *sem = (sem_t *)arg;
(*sem)->nwaiters--;
/*
* this function is called from cancellation point,
* the mutex should already be hold.
*/
_pthread_mutex_unlock(&(*sem)->lock);
}
sem_wait(sem_t *sem)
{
int retval;
@ -266,11 +278,15 @@ sem_wait(sem_t *sem)
goto RETURN;
}
_pthread_testcancel();
_pthread_mutex_lock(&(*sem)->lock);
while ((*sem)->count == 0) {
(*sem)->nwaiters++;
_pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock);
_pthread_cleanup_push(decrease_nwaiters);
pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock);
pthread_cleanup_pop(0);
(*sem)->nwaiters--;
}
(*sem)->count--;