Fix prototype mismatch and use of un-namespaced pthread functions.

This commit is contained in:
Dag-Erling Smørgrav 2006-03-28 21:50:12 +00:00
parent 552585665b
commit adb19548bd
2 changed files with 14 additions and 22 deletions

View File

@ -52,10 +52,6 @@ LT10_COMPAT_DEFAULT(sem_timedwait);
LT10_COMPAT_PRIVATE(_sem_post); LT10_COMPAT_PRIVATE(_sem_post);
LT10_COMPAT_DEFAULT(sem_post); LT10_COMPAT_DEFAULT(sem_post);
extern int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
extern int pthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *,
struct timespec *);
__weak_reference(_sem_init, sem_init); __weak_reference(_sem_init, sem_init);
__weak_reference(_sem_wait, sem_wait); __weak_reference(_sem_wait, sem_wait);
__weak_reference(_sem_timedwait, sem_timedwait); __weak_reference(_sem_timedwait, sem_timedwait);
@ -161,13 +157,13 @@ _sem_wait(sem_t *sem)
_thr_cancel_leave(curthread, retval != 0); _thr_cancel_leave(curthread, retval != 0);
} }
else { else {
pthread_testcancel(); _pthread_testcancel();
_pthread_mutex_lock(&(*sem)->lock); _pthread_mutex_lock(&(*sem)->lock);
while ((*sem)->count <= 0) { while ((*sem)->count <= 0) {
(*sem)->nwaiters++; (*sem)->nwaiters++;
THR_CLEANUP_PUSH(curthread, decrease_nwaiters, sem); THR_CLEANUP_PUSH(curthread, decrease_nwaiters, sem);
pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock); _pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock);
THR_CLEANUP_POP(curthread, 0); THR_CLEANUP_POP(curthread, 0);
(*sem)->nwaiters--; (*sem)->nwaiters--;
} }
@ -182,7 +178,7 @@ _sem_wait(sem_t *sem)
int int
_sem_timedwait(sem_t * __restrict sem, _sem_timedwait(sem_t * __restrict sem,
struct timespec * __restrict abs_timeout) const struct timespec * __restrict abs_timeout)
{ {
struct pthread *curthread; struct pthread *curthread;
int retval; int retval;
@ -205,7 +201,7 @@ _sem_timedwait(sem_t * __restrict sem,
* segfault on an invalid address doesn't end * segfault on an invalid address doesn't end
* up leaving the mutex locked. * up leaving the mutex locked.
*/ */
pthread_testcancel(); _pthread_testcancel();
timeout_invalid = (abs_timeout->tv_nsec >= 1000000000) || timeout_invalid = (abs_timeout->tv_nsec >= 1000000000) ||
(abs_timeout->tv_nsec < 0); (abs_timeout->tv_nsec < 0);
_pthread_mutex_lock(&(*sem)->lock); _pthread_mutex_lock(&(*sem)->lock);
@ -217,10 +213,10 @@ _sem_timedwait(sem_t * __restrict sem,
return (-1); return (-1);
} }
(*sem)->nwaiters++; (*sem)->nwaiters++;
pthread_cleanup_push(decrease_nwaiters, sem); _pthread_cleanup_push(decrease_nwaiters, sem);
pthread_cond_timedwait(&(*sem)->gtzero, _pthread_cond_timedwait(&(*sem)->gtzero,
&(*sem)->lock, abs_timeout); &(*sem)->lock, abs_timeout);
pthread_cleanup_pop(0); _pthread_cleanup_pop(0);
(*sem)->nwaiters--; (*sem)->nwaiters--;
} }
if ((*sem)->count == 0) { if ((*sem)->count == 0) {

View File

@ -52,10 +52,6 @@ LT10_COMPAT_DEFAULT(sem_timedwait);
LT10_COMPAT_PRIVATE(_sem_post); LT10_COMPAT_PRIVATE(_sem_post);
LT10_COMPAT_DEFAULT(sem_post); LT10_COMPAT_DEFAULT(sem_post);
extern int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
extern int pthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *,
struct timespec *);
__weak_reference(_sem_init, sem_init); __weak_reference(_sem_init, sem_init);
__weak_reference(_sem_wait, sem_wait); __weak_reference(_sem_wait, sem_wait);
__weak_reference(_sem_timedwait, sem_timedwait); __weak_reference(_sem_timedwait, sem_timedwait);
@ -161,13 +157,13 @@ _sem_wait(sem_t *sem)
_thr_cancel_leave(curthread, retval != 0); _thr_cancel_leave(curthread, retval != 0);
} }
else { else {
pthread_testcancel(); _pthread_testcancel();
_pthread_mutex_lock(&(*sem)->lock); _pthread_mutex_lock(&(*sem)->lock);
while ((*sem)->count <= 0) { while ((*sem)->count <= 0) {
(*sem)->nwaiters++; (*sem)->nwaiters++;
THR_CLEANUP_PUSH(curthread, decrease_nwaiters, sem); THR_CLEANUP_PUSH(curthread, decrease_nwaiters, sem);
pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock); _pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock);
THR_CLEANUP_POP(curthread, 0); THR_CLEANUP_POP(curthread, 0);
(*sem)->nwaiters--; (*sem)->nwaiters--;
} }
@ -182,7 +178,7 @@ _sem_wait(sem_t *sem)
int int
_sem_timedwait(sem_t * __restrict sem, _sem_timedwait(sem_t * __restrict sem,
struct timespec * __restrict abs_timeout) const struct timespec * __restrict abs_timeout)
{ {
struct pthread *curthread; struct pthread *curthread;
int retval; int retval;
@ -205,7 +201,7 @@ _sem_timedwait(sem_t * __restrict sem,
* segfault on an invalid address doesn't end * segfault on an invalid address doesn't end
* up leaving the mutex locked. * up leaving the mutex locked.
*/ */
pthread_testcancel(); _pthread_testcancel();
timeout_invalid = (abs_timeout->tv_nsec >= 1000000000) || timeout_invalid = (abs_timeout->tv_nsec >= 1000000000) ||
(abs_timeout->tv_nsec < 0); (abs_timeout->tv_nsec < 0);
_pthread_mutex_lock(&(*sem)->lock); _pthread_mutex_lock(&(*sem)->lock);
@ -217,10 +213,10 @@ _sem_timedwait(sem_t * __restrict sem,
return (-1); return (-1);
} }
(*sem)->nwaiters++; (*sem)->nwaiters++;
pthread_cleanup_push(decrease_nwaiters, sem); _pthread_cleanup_push(decrease_nwaiters, sem);
pthread_cond_timedwait(&(*sem)->gtzero, _pthread_cond_timedwait(&(*sem)->gtzero,
&(*sem)->lock, abs_timeout); &(*sem)->lock, abs_timeout);
pthread_cleanup_pop(0); _pthread_cleanup_pop(0);
(*sem)->nwaiters--; (*sem)->nwaiters--;
} }
if ((*sem)->count == 0) { if ((*sem)->count == 0) {