CARMA C++
ThreadQuit.h
1 #ifndef CARMA_UTIL_THREAD_QUIT_H
2 #define CARMA_UTIL_THREAD_QUIT_H
3 
4 #include <pthread.h>
5 
6 namespace carma {
7 namespace util {
8 
9 
10 void ThreadQuitTestSelf( );
11 
12 void RequestThreadQuit( ::pthread_t thread );
13 
14 bool CaughtExceptionIsThreadQuitRequestedError( );
15 
16 void RethrowCaughtExceptionIfThreadQuitRequestedError( );
17 
18 bool MarkCaughtExceptionOkayToDestructIfThreadQuitRequestedError( );
19 
20 
21 class ScopedThreadQuitDeferSelf {
22  public:
23  explicit ScopedThreadQuitDeferSelf( );
24 
25  /* virtual */ ~ScopedThreadQuitDeferSelf( );
26 
27  private:
28  // No copying
29  ScopedThreadQuitDeferSelf( const ScopedThreadQuitDeferSelf & );
30  ScopedThreadQuitDeferSelf & operator=( const ScopedThreadQuitDeferSelf & );
31 };
32 
33 
34 class ScopedThreadQuitRegisterSelf {
35  public:
36  explicit ScopedThreadQuitRegisterSelf( );
37 
38  /* virtual */ ~ScopedThreadQuitRegisterSelf( );
39 
40  private:
41  // No copying
42  ScopedThreadQuitRegisterSelf( const ScopedThreadQuitRegisterSelf & );
43  ScopedThreadQuitRegisterSelf & operator=( const ScopedThreadQuitRegisterSelf & );
44 };
45 
46 
47 class ThreadQuitRequestHandler {
48  public:
49  virtual ~ThreadQuitRequestHandler( ) { }
50 
51  virtual void HandleQuitRequest( ::pthread_t thread ) = 0;
52 };
53 
54 
55 class ScopedThreadQuitRequestHandlerSelf {
56  public:
57  explicit ScopedThreadQuitRequestHandlerSelf( ThreadQuitRequestHandler & handler );
58 
59  /* virtual */ ~ScopedThreadQuitRequestHandlerSelf( );
60 
61  private:
62  // No copying
63  ScopedThreadQuitRequestHandlerSelf( const ScopedThreadQuitRequestHandlerSelf & );
64  ScopedThreadQuitRequestHandlerSelf & operator=( const ScopedThreadQuitRequestHandlerSelf & );
65 
66  ::size_t handlerCookie_;
67 };
68 
69 
70 } // namespace carma::util
71 } // namespace carma
72 
73 #endif