Cancel a thread
#include <sys/neutrino.h> int ThreadCancel( int tid, void (*canstub)(void) ); int ThreadCancel_r( int tid, void (*canstub)(void) );
- The ID of the thread that you want to destroy, as returned by ThreadCreate().
- A pointer to the location that you want the thread to jump to when
the cancellation occurs; see below.
You must provide a canstub function.
Use the -l c option to qcc to link against this library. This library is usually included automatically.
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.
When the cancellation is acted upon, the thread jumps to the location specified by canstub. This stub should call cancellation cleanup handlers for the thread. When the last cancellation cleanup handler returns, the stub must terminate the thread using:
ThreadDestroy( 0, -1, PTHREAD_CANCEL);
Unlike ThreadDestroy(), which destroys a thread immediately, ThreadCancel() requests that the target thread execute any cleanup code and then terminate at its earliest convenience.
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:
|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 any of the calls defined in the table below. All kernel calls that block are cancellation points, with the exception of MsgSendvnc() and SyncMutexLock().|
|Enabled||Async||Cancellation happens immediately.|
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().
These calls don't block.
The only difference between these functions is the way they indicate errors:
- If an error occurs, the function returns -1 and sets errno. Any other value returned indicates success.
- EOK is returned on success. This function does NOT set errno. If an error occurs, any value in the Errors section may be returned.
- The thread indicated by tid doesn't exist.