summaryrefslogtreecommitdiff
path: root/lib/libpthread/uthread/uthread_suspend_np.c
diff options
context:
space:
mode:
authorTodd T. Fries <todd@cvs.openbsd.org>2001-08-30 17:47:58 +0000
committerTodd T. Fries <todd@cvs.openbsd.org>2001-08-30 17:47:58 +0000
commita4799ae63ccc20098591b8ddfd0e6d90ea031503 (patch)
tree41768fe12c9e57db59309ae2adaf08a63fd99e38 /lib/libpthread/uthread/uthread_suspend_np.c
parent7bf7e5116096ca874919597af7c068271601588a (diff)
Back out fgsch@'s tree breaking commits.
Test next time, ok?
Diffstat (limited to 'lib/libpthread/uthread/uthread_suspend_np.c')
-rw-r--r--lib/libpthread/uthread/uthread_suspend_np.c109
1 files changed, 11 insertions, 98 deletions
diff --git a/lib/libpthread/uthread/uthread_suspend_np.c b/lib/libpthread/uthread/uthread_suspend_np.c
index 1758766fecf..8b88053db77 100644
--- a/lib/libpthread/uthread/uthread_suspend_np.c
+++ b/lib/libpthread/uthread/uthread_suspend_np.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uthread_suspend_np.c,v 1.5 2001/08/30 07:40:47 fgsch Exp $ */
+/* $OpenBSD: uthread_suspend_np.c,v 1.6 2001/08/30 17:47:57 todd Exp $ */
/*
* Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>.
* All rights reserved.
@@ -37,8 +37,6 @@
#include <pthread.h>
#include "pthread_private.h"
-static void finish_suspension(void *arg);
-
/* Suspend a thread: */
int
pthread_suspend_np(pthread_t thread)
@@ -47,98 +45,22 @@ pthread_suspend_np(pthread_t thread)
/* Find the thread in the list of active threads: */
if ((ret = _find_thread(thread)) == 0) {
+ /* The thread exists. Is it running? */
+ if (thread->state != PS_RUNNING &&
+ thread->state != PS_SUSPENDED) {
+ /* The thread operation has been interrupted */
+ _thread_seterrno(thread,EINTR);
+ thread->interrupted = 1;
+ }
+
/*
* Defer signals to protect the scheduling queues from
* access by the signal handler:
*/
_thread_kern_sig_defer();
- switch (thread->state) {
- case PS_RUNNING:
- /*
- * Remove the thread from the priority queue and
- * set the state to suspended:
- */
- PTHREAD_PRIOQ_REMOVE(thread);
- PTHREAD_SET_STATE(thread, PS_SUSPENDED);
- break;
-
- case PS_SPINBLOCK:
- case PS_FDR_WAIT:
- case PS_FDW_WAIT:
- case PS_POLL_WAIT:
- case PS_SELECT_WAIT:
- /*
- * Remove these threads from the work queue
- * and mark the operation as interrupted:
- */
- if ((thread->flags & PTHREAD_FLAGS_IN_WORKQ) != 0)
- PTHREAD_WORKQ_REMOVE(thread);
- _thread_seterrno(thread, EINTR);
-
- /* FALLTHROUGH */
- case PS_SLEEP_WAIT:
- thread->interrupted = 1;
-
- /* FALLTHROUGH */
- case PS_SIGTHREAD:
- case PS_WAIT_WAIT:
- case PS_SIGSUSPEND:
- case PS_SIGWAIT:
- /*
- * Remove these threads from the waiting queue and
- * set their state to suspended:
- */
- PTHREAD_WAITQ_REMOVE(thread);
- PTHREAD_SET_STATE(thread, PS_SUSPENDED);
- break;
-
- case PS_MUTEX_WAIT:
- /* Mark the thread as suspended and still in a queue. */
- thread->suspended = SUSP_MUTEX_WAIT;
-
- PTHREAD_SET_STATE(thread, PS_SUSPENDED);
- break;
- case PS_COND_WAIT:
- /* Mark the thread as suspended and still in a queue. */
- thread->suspended = SUSP_COND_WAIT;
-
- PTHREAD_SET_STATE(thread, PS_SUSPENDED);
- break;
- case PS_JOIN:
- /* Mark the thread as suspended and joining: */
- thread->suspended = SUSP_JOIN;
-
- PTHREAD_NEW_STATE(thread, PS_SUSPENDED);
- break;
- case PS_FDLR_WAIT:
- case PS_FDLW_WAIT:
- case PS_FILE_WAIT:
- /* Mark the thread as suspended: */
- thread->suspended = SUSP_YES;
-
- /*
- * Threads in these states may be in queues.
- * In order to preserve queue integrity, the
- * cancelled thread must remove itself from the
- * queue. Mark the thread as interrupted and
- * set the state to running. When the thread
- * resumes, it will remove itself from the queue
- * and call the suspension completion routine.
- */
- thread->interrupted = 1;
- _thread_seterrno(thread, EINTR);
- PTHREAD_NEW_STATE(thread, PS_RUNNING);
- thread->continuation = finish_suspension;
- break;
-
- case PS_DEAD:
- case PS_DEADLOCK:
- case PS_STATE_MAX:
- case PS_SUSPENDED:
- /* Nothing needs to be done: */
- break;
- }
+ /* Suspend the thread. */
+ PTHREAD_NEW_STATE(thread,PS_SUSPENDED);
/*
* Undefer and handle pending signals, yielding if
@@ -148,13 +70,4 @@ pthread_suspend_np(pthread_t thread)
}
return(ret);
}
-
-static void
-finish_suspension(void *arg)
-{
- struct pthread *curthread = _get_curthread();
-
- if (curthread->suspended != SUSP_NO)
- _thread_kern_sched_state(PS_SUSPENDED, __FILE__, __LINE__);
-}
#endif