diff options
author | deischen <deischen@FreeBSD.org> | 2003-05-19 23:04:50 +0000 |
---|---|---|
committer | deischen <deischen@FreeBSD.org> | 2003-05-19 23:04:50 +0000 |
commit | b26e5b44e091598edccd3d8954dc42037109f560 (patch) | |
tree | 40f53734ab843598c83e52d250d2e4c69ce3a826 /lib/libpthread/thread | |
parent | da1b9f9f885f1d617fdc7f06432b3ea1d2c18408 (diff) | |
download | FreeBSD-src-b26e5b44e091598edccd3d8954dc42037109f560.zip FreeBSD-src-b26e5b44e091598edccd3d8954dc42037109f560.tar.gz |
Eek, staticize a couple of functions that shouldn't
be external (initialize()!).
Remove cancellation points from _pthread_cond_wait and
_pthread_cond_timedwait (single underscore versions are
libc private functions). Point the weak reference(!) for
these functions to the versions with cancellation points.
Approved by: re@(blanket till 5/19)
Pointed out by: kan (cancellation point bug)
Diffstat (limited to 'lib/libpthread/thread')
-rw-r--r-- | lib/libpthread/thread/thr_cond.c | 33 | ||||
-rw-r--r-- | lib/libpthread/thread/thr_kern.c | 7 | ||||
-rw-r--r-- | lib/libpthread/thread/thr_pselect.c | 4 |
3 files changed, 21 insertions, 23 deletions
diff --git a/lib/libpthread/thread/thr_cond.c b/lib/libpthread/thread/thr_cond.c index 1b0325f..15b95f7 100644 --- a/lib/libpthread/thread/thr_cond.c +++ b/lib/libpthread/thread/thr_cond.c @@ -49,10 +49,16 @@ static inline struct pthread *cond_queue_deq(pthread_cond_t); static inline void cond_queue_remove(pthread_cond_t, pthread_t); static inline void cond_queue_enq(pthread_cond_t, pthread_t); +/* + * Double underscore versions are cancellation points. Single underscore + * versions are not and are provided for libc internal usage (which + * shouldn't introduce cancellation points). + */ +__weak_reference(__pthread_cond_wait, pthread_cond_wait); +__weak_reference(__pthread_cond_timedwait, pthread_cond_timedwait); + __weak_reference(_pthread_cond_init, pthread_cond_init); __weak_reference(_pthread_cond_destroy, pthread_cond_destroy); -__weak_reference(_pthread_cond_wait, pthread_cond_wait); -__weak_reference(_pthread_cond_timedwait, pthread_cond_timedwait); __weak_reference(_pthread_cond_signal, pthread_cond_signal); __weak_reference(_pthread_cond_broadcast, pthread_cond_broadcast); @@ -167,22 +173,16 @@ _pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) int unlock_mutex = 1; int seqno; - _thr_enter_cancellation_point(curthread); - - if (cond == NULL) { - _thr_leave_cancellation_point(curthread); + if (cond == NULL) return (EINVAL); - } /* * If the condition variable is statically initialized, * perform the dynamic initialization: */ if (*cond == NULL && - (rval = pthread_cond_init(cond, NULL)) != 0) { - _thr_leave_cancellation_point(curthread); + (rval = pthread_cond_init(cond, NULL)) != 0) return (rval); - } /* * Enter a loop waiting for a condition signal or broadcast @@ -348,8 +348,6 @@ _pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) curthread->continuation((void *) curthread); } while ((done == 0) && (rval == 0)); - _thr_leave_cancellation_point(curthread); - /* Return the completion status: */ return (rval); } @@ -379,21 +377,16 @@ _pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex, THR_ASSERT(curthread->locklevel == 0, "cv_timedwait: locklevel is not zero!"); - _thr_enter_cancellation_point(curthread); if (abstime == NULL || abstime->tv_sec < 0 || abstime->tv_nsec < 0 || - abstime->tv_nsec >= 1000000000) { - _thr_leave_cancellation_point(curthread); + abstime->tv_nsec >= 1000000000) return (EINVAL); - } /* * If the condition variable is statically initialized, perform dynamic * initialization. */ - if (*cond == NULL && (rval = pthread_cond_init(cond, NULL)) != 0) { - _thr_leave_cancellation_point(curthread); + if (*cond == NULL && (rval = pthread_cond_init(cond, NULL)) != 0) return (rval); - } /* * Enter a loop waiting for a condition signal or broadcast @@ -556,8 +549,6 @@ _pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex, curthread->continuation((void *)curthread); } while ((done == 0) && (rval == 0)); - _thr_leave_cancellation_point(curthread); - /* Return the completion status: */ return (rval); } diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c index 2df1634..128b054 100644 --- a/lib/libpthread/thread/thr_kern.c +++ b/lib/libpthread/thread/thr_kern.c @@ -117,6 +117,9 @@ static int inited = 0; static int active_kse_count = 0; static int active_kseg_count = 0; +#ifdef DEBUG_THREAD_KERN +static void dump_queues(struct kse *curkse); +#endif static void kse_check_completed(struct kse *kse); static void kse_check_waitq(struct kse *kse); static void kse_check_signals(struct kse *kse); @@ -762,7 +765,8 @@ kse_sched_single(struct kse *curkse) } #endif -void +#ifdef DEBUG_THREAD_KERN +static void dump_queues(struct kse *curkse) { struct pthread *thread; @@ -773,6 +777,7 @@ dump_queues(struct kse *curkse) thread, thread->state, thread->blocked); } } +#endif /* * This is the scheduler for a KSE which runs multiple threads. diff --git a/lib/libpthread/thread/thr_pselect.c b/lib/libpthread/thread/thr_pselect.c index c80a1cf..c1a4c5d 100644 --- a/lib/libpthread/thread/thr_pselect.c +++ b/lib/libpthread/thread/thr_pselect.c @@ -40,8 +40,10 @@ __FBSDID("$FreeBSD$"); extern int __pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds, const struct timespec *timo, const sigset_t *mask); +__weak_reference(_pselect, pselect); + int -pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds, +_pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds, const struct timespec *timo, const sigset_t *mask) { struct pthread *curthread = _get_curthread(); |