summaryrefslogtreecommitdiff
path: root/cancel.c
diff options
context:
space:
mode:
authorrpj <rpj>1998-07-24 12:21:27 +0000
committerrpj <rpj>1998-07-24 12:21:27 +0000
commiteafdb5db2871e893574fd0da01554d1a50b7471f (patch)
treed9745ff3e93354d8b836dfda8cdebd0ff8a760b4 /cancel.c
parent2049e2d3f0bce851995dda72511996c14e51ac66 (diff)
Fri Jul 24 21:13:55 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* cancel.c (pthread_cancel): Implement. (pthread_testcancel): Implement. * exit.c (pthread_exit): Add comment explaining the longjmp(). * implement.h (_pthread_threads_thread_t): New member cancelthread. (_PTHREAD_YES): Define. (_PTHREAD_NO): Define. (RND_SIZEOF): Remove. * create.c (pthread_create): Rename cancelability to cancelstate. * pthread.h (pthread_attr_t): Rename cancelability to cancelstate. (PTHREAD_CANCELED): Define.
Diffstat (limited to 'cancel.c')
-rw-r--r--cancel.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/cancel.c b/cancel.c
index 72c41ad..e9e33f1 100644
--- a/cancel.c
+++ b/cancel.c
@@ -47,3 +47,41 @@ pthread_setcanceltype(int type, int *oldtype)
this->canceltype = type;
return 0;
}
+
+int
+pthread_cancel(pthread_t thread)
+{
+ _pthread_threads_thread_t * this;
+
+ this = _PTHREAD_THIS;
+
+ if (this == NULL)
+ {
+ return ESRCH;
+ }
+
+ this->cancelthread = _PTHREAD_YES;
+
+ return 0;
+}
+
+void
+pthread_testcancel(void)
+{
+ _pthread_threads_thread_t * this;
+
+ this = _PTHREAD_THIS;
+
+ if (this == NULL ||
+ this->attr.cancelstate == PTHREAD_CANCEL_DISABLE)
+ {
+ return;
+ }
+
+ if (this->cancelthread == _PTHREAD_YES)
+ {
+ pthread_exit(PTHREAD_CANCELED);
+
+ /* Never reached. */
+ }
+}