/*************************************************************************** $name: ThrInter.c $version: 1.0 $date_modified: 082499 $description: Demonstrates interrupting a thread blocked on a condition variable. $owner: NKS Product Manager Copyright (c) 1999 Novell, Inc. All Rights Reserved. THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES. USE AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO THE LICENSE AGREEMENT ACCOMPANYING THE SOFTWARE DEVELOPMENT KIT (SDK) THAT CONTAINS THIS WORK. PURSUANT TO THE SDK LICENSE AGREEMENT, NOVELL HEREBY GRANTS TO DEVELOPER A ROYALTY-FREE, NON-EXCLUSIVE LICENSE TO INCLUDE NOVELL'S SAMPLE CODE IN ITS PRODUCT. NOVELL GRANTS DEVELOPER WORLDWIDE DISTRIBUTION RIGHTS TO MARKET, DISTRIBUTE, OR SELL NOVELL'S SAMPLE CODE AS A COMPONENT OF DEVELOPER'S PRODUCTS. NOVELL SHALL HAVE NO OBLIGATIONS TO DEVELOPER OR DEVELOPER'S CUSTOMERS WITH RESPECT TO THIS CODE. ****************************************************************************/ #include <stdio.h> #include <nks/errno.h> #include <nks/synch.h> #include <nks/thread.h> void ThreadFunc ( int *arg ) { int err; NXCond_t *cond; NXMutex_t *mutex; NXInterruptSet_t set; printf("Thread %d running on context :%08x\n", NXThreadGetId(), *(int *)arg); cond = NXCondAlloc(NULL); mutex = NXMutexAlloc(0, NULL, NULL); err = NXCondWait(cond, mutex); // if block on condition variable was interrupted... if (err == NX_EINTR) { printf("Interrupted.\n"); // read the interrupt state and clear it... NXThreadIsInterrupted(&set); } NXMutexFree(mutex); NXCondFree(cond); } void main( void ) { int err; NXContext_t *myContext; NXThreadId_t myThread; NXInterruptId_t inter = 1; myContext = NXContextAlloc(ThreadFunc, &myContext, NX_PRIO_MED, 0, NX_CTX_NORMAL, &err); if (myContext) { if (!NXThreadCreate(myContext, NX_THR_DETACHED, &myThread)) { // wait for thread to start, then... NXThreadDelay(2000); // ...interrupt it! NXThreadInterrupt(myThread, inter); } } }