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:
parent
6c6b4e5dcd
commit
cc3782cbc7
@ -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--;
|
||||
|
Loading…
x
Reference in New Issue
Block a user