ThreadCancel(), ThreadCancel_r()
Cancel a thread
Synopsis:
#include <sys/neutrino.h>
int ThreadCancel( int tid,
                  void (*canstub)(void) );
int ThreadCancel_r( int tid,
                    void (*canstub)(void) );
Arguments:
- tid
 - The ID of the thread that you want to cancel, as returned by ThreadCreate().
 - canstub
 - A pointer to the location that you want the thread to jump to when
  the cancellation occurs; see below.
  Note:You must provide a canstub function.
 
Library:
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
Description:
These kernel calls request that the thread specified by tid be canceled. The target thread's cancelability state and type determine when the cancellation takes effect.
The ThreadCancel() and ThreadCancel_r() functions are identical, except in the way they indicate errors. See the Returns section for details.
Unlike ThreadDestroy(), which destroys a thread immediately, ThreadCancel() allows you to provide a function (canstub) that requests that the target thread execute any cleanup code and then terminate at its earliest convenience.
pthread_exit( PTHREAD_CANCELED );
The cancellation processing in the target thread runs asynchronously with respect to the calling thread, which doesn't block.
The combinations of cancelability state and type are as follows:
| State | Type | Description | 
|---|---|---|
| Disabled | Deferred | Cancel requests are made pending. | 
| Disabled | Async | Cancel requests are made pending. | 
| Enabled | Deferred | Cancellation happens at the next cancellation point. These are at explicitly coded calls to pthread_testcancel() or an attempt to enter a blocking state in certain calls (see below). All kernel calls that block are cancellation points, with the exception of MsgSendvnc() and SyncMutexLock(). | 
| Enabled | Async | Cancellation happens immediately. | 
Use pthread_setcancelstate(), and pthread_setcanceltype() to set the state and type.
POSIX defines a list of functions that are cancellation points; some functions that aren't listed there may also be cancellation points. Any function that calls a blocking kernel call that's a cancellation point will itself become a cancellation point when the kernel call is made. The most common blocking kernel call in library code is MsgSendv().
Blocking states
These calls don't block.
Returns:
The only difference between these functions is the way they indicate errors:
- ThreadCancel()
 - If an error occurs, the function returns -1 and sets errno. Any other value returned indicates success.
 - ThreadCancel_r()
 - EOK is returned on success. This function does NOT set errno. If an error occurs, any value in the Errors section may be returned.
 
Errors:
- ESRCH
 - The thread indicated by tid doesn't exist.
 
Classification:
| Safety: | |
|---|---|
| Cancellation point | No | 
| Signal handler | Yes | 
| Thread | Yes | 
