diff options
Diffstat (limited to 'ACE/examples/APG/ThreadManagement/Async_Cancel.cpp')
-rw-r--r-- | ACE/examples/APG/ThreadManagement/Async_Cancel.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/ACE/examples/APG/ThreadManagement/Async_Cancel.cpp b/ACE/examples/APG/ThreadManagement/Async_Cancel.cpp new file mode 100644 index 00000000000..5d5d5fcf0e8 --- /dev/null +++ b/ACE/examples/APG/ThreadManagement/Async_Cancel.cpp @@ -0,0 +1,63 @@ +// $Id$ + +#include "ace/OS_NS_unistd.h" +#include "ace/Task.h" +#include "ace/Log_Msg.h" + +#if defined (ACE_HAS_PTHREADS) +// Only works on Pthreads... + +// Listing 1 code/ch13 +class CanceledTask : public ACE_Task<ACE_MT_SYNCH> +{ +public: + virtual int svc (void) + { + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Starting thread\n"))); + + if (this->set_cancel_mode () < 0) + return -1; + + while (1) + { + // Put this thread in a compute loop.. no + // cancellation points are available. + } + } + + int set_cancel_mode (void) + { + cancel_state new_state; + + // Set the cancel state to asynchronous and enabled. + new_state.cancelstate = PTHREAD_CANCEL_ENABLE; + new_state.canceltype = PTHREAD_CANCEL_ASYNCHRONOUS; + if (ACE_Thread::setcancelstate (new_state, 0) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("cancelstate")), -1); + return 0; + } +}; +// Listing 1 +// Listing 2 code/ch13 +int ACE_TMAIN (int, ACE_TCHAR *[]) +{ + CanceledTask task; + task.activate (); + ACE_OS::sleep (1); + ACE_Thread_Manager::instance ()->cancel_task (&task, 1); + task.wait (); + + return 0; +} +// Listing 2 + +#else /* ACE_HAS_PTHREADS */ +int ACE_TMAIN (int, ACE_TCHAR *[]) +{ + puts ("This example works on Pthreads platforms.\n"); + return 0; +} +#endif /* ACE_HAS_PTHREADS */ + |