summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authormini <mini@FreeBSD.org>2002-11-24 06:45:45 +0000
committermini <mini@FreeBSD.org>2002-11-24 06:45:45 +0000
commit930a90029b6caa57e0cf42fa13f6d4e6e14150cb (patch)
treea39e089818c7c2d431b3cee8a2b3effe72c651e5 /lib
parenta00a2d6daf8e1aa5488be408953670ca968c7625 (diff)
downloadFreeBSD-src-930a90029b6caa57e0cf42fa13f6d4e6e14150cb.zip
FreeBSD-src-930a90029b6caa57e0cf42fa13f6d4e6e14150cb.tar.gz
Schedule spinlocked threads by moving them through the work queue, instead
of the wait queue. Approved by: re (blanket) Stolen from: davidxu
Diffstat (limited to 'lib')
-rw-r--r--lib/libkse/thread/thr_kern.c17
-rw-r--r--lib/libpthread/thread/thr_kern.c17
2 files changed, 30 insertions, 4 deletions
diff --git a/lib/libkse/thread/thr_kern.c b/lib/libkse/thread/thr_kern.c
index 087e1df..0747cff 100644
--- a/lib/libkse/thread/thr_kern.c
+++ b/lib/libkse/thread/thr_kern.c
@@ -166,7 +166,18 @@ _thread_kern_sched(void)
case PS_SPINBLOCK:
/* Increment spinblock count. */
_spinblock_count++;
- /*FALLTHROUGH*/
+
+ /* No timeouts for these states. */
+ curthread->wakeup_time.tv_sec = -1;
+ curthread->wakeup_time.tv_nsec = -1;
+
+ /* Restart the time slice. */
+ curthread->slice_usec = -1;
+
+ /* Insert into the work queue. */
+ PTHREAD_WORKQ_INSERT(curthread);
+ break;
+
case PS_DEADLOCK:
case PS_JOIN:
case PS_MUTEX_WAIT:
@@ -288,7 +299,9 @@ _thread_kern_scheduler(struct kse_mailbox *km)
access_lock == 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
- PTHREAD_NEW_STATE(pthread,
+ PTHREAD_PRIOQ_INSERT_TAIL(
+ pthread);
+ PTHREAD_SET_STATE(pthread,
PS_RUNNING);
PTHREAD_WAITQ_SETACTIVE();
diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c
index 087e1df..0747cff 100644
--- a/lib/libpthread/thread/thr_kern.c
+++ b/lib/libpthread/thread/thr_kern.c
@@ -166,7 +166,18 @@ _thread_kern_sched(void)
case PS_SPINBLOCK:
/* Increment spinblock count. */
_spinblock_count++;
- /*FALLTHROUGH*/
+
+ /* No timeouts for these states. */
+ curthread->wakeup_time.tv_sec = -1;
+ curthread->wakeup_time.tv_nsec = -1;
+
+ /* Restart the time slice. */
+ curthread->slice_usec = -1;
+
+ /* Insert into the work queue. */
+ PTHREAD_WORKQ_INSERT(curthread);
+ break;
+
case PS_DEADLOCK:
case PS_JOIN:
case PS_MUTEX_WAIT:
@@ -288,7 +299,9 @@ _thread_kern_scheduler(struct kse_mailbox *km)
access_lock == 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
- PTHREAD_NEW_STATE(pthread,
+ PTHREAD_PRIOQ_INSERT_TAIL(
+ pthread);
+ PTHREAD_SET_STATE(pthread,
PS_RUNNING);
PTHREAD_WAITQ_SETACTIVE();
OpenPOWER on IntegriCloud