diff options
| author | rpj <rpj> | 1998-07-24 12:21:27 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 1998-07-24 12:21:27 +0000 | 
| commit | eafdb5db2871e893574fd0da01554d1a50b7471f (patch) | |
| tree | d9745ff3e93354d8b836dfda8cdebd0ff8a760b4 /cancel.c | |
| parent | 2049e2d3f0bce851995dda72511996c14e51ac66 (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.c | 38 | 
1 files changed, 38 insertions, 0 deletions
| @@ -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. */ +    } +} | 
