summaryrefslogtreecommitdiffstats
path: root/lib/libpthread
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2003-05-19 23:04:50 +0000
committerdeischen <deischen@FreeBSD.org>2003-05-19 23:04:50 +0000
commitb26e5b44e091598edccd3d8954dc42037109f560 (patch)
tree40f53734ab843598c83e52d250d2e4c69ce3a826 /lib/libpthread
parentda1b9f9f885f1d617fdc7f06432b3ea1d2c18408 (diff)
downloadFreeBSD-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')
-rw-r--r--lib/libpthread/arch/i386/i386/ksd.c4
-rw-r--r--lib/libpthread/thread/thr_cond.c33
-rw-r--r--lib/libpthread/thread/thr_kern.c7
-rw-r--r--lib/libpthread/thread/thr_pselect.c4
4 files changed, 24 insertions, 24 deletions
diff --git a/lib/libpthread/arch/i386/i386/ksd.c b/lib/libpthread/arch/i386/i386/ksd.c
index 90123c1..791c636 100644
--- a/lib/libpthread/arch/i386/i386/ksd.c
+++ b/lib/libpthread/arch/i386/i386/ksd.c
@@ -48,7 +48,9 @@ __FBSDID("$FreeBSD$");
static unsigned int ldt_mask[LDT_WORDS];
static int initialized = 0;
-void
+static void initialize(void);
+
+static void
initialize(void)
{
int i, j;
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();
OpenPOWER on IntegriCloud