diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2000-08-25 23:27:19 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2000-08-25 23:27:19 +0000 |
commit | 07641bf3bda79873da15bd4c551806f230213d43 (patch) | |
tree | 93c1a7ae2cbb60ad88b4a06ce9b0bd9a41639279 /ace/Thread_Adapter.h | |
parent | 2ecfe972ecdaf8e8f5807f22d55c060efe837712 (diff) | |
download | ATCD-07641bf3bda79873da15bd4c551806f230213d43.tar.gz |
ChangeLogTag:Fri Aug 25 16:15:50 2000 Carlos O'Ryan <coryan@uci.edu>
Diffstat (limited to 'ace/Thread_Adapter.h')
-rw-r--r-- | ace/Thread_Adapter.h | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/ace/Thread_Adapter.h b/ace/Thread_Adapter.h new file mode 100644 index 00000000000..9da861cb5d3 --- /dev/null +++ b/ace/Thread_Adapter.h @@ -0,0 +1,169 @@ +// $Id$ + +// ============================================================================ +// +// = LIBRARY +// ace +// +// = FILENAME +// Thread_Adapter.h +// +// = AUTHOR +// Carlos O'Ryan <coryan@uci.edu> +// +// ============================================================================ + +#ifndef ACE_THREAD_ADAPTER_H +#define ACE_THREAD_ADAPTER_H +#include "ace/pre.h" + +#include "ace/config-all.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ace/OS.h" + +// Run the thread entry point for the <ACE_Thread_Adapter>. This must +// be an extern "C" to make certain compilers happy... +#if defined (ACE_PSOS) +extern "C" void ace_thread_adapter (unsigned long args); +#else /* ! defined (ACE_PSOS) */ +extern "C" ACE_Export void *ace_thread_adapter (void *args); +#endif /* ACE_PSOS */ + +class ACE_OS_Thread_Descriptor +{ + // = TITLE + // Parent class of all ACE_Thread_Descriptor classes. + // + // = + // Container for ACE_Thread_Descriptor members that are + // used in ACE_OS. +public: + long flags (void) const; + // Get the thread creation flags. + +protected: + ACE_OS_Thread_Descriptor (long flags = 0); + // For use by ACE_Thread_Descriptor. + + long flags_; + // Keeps track of whether this thread was created "detached" or not. + // If a thread is *not* created detached then if someone calls + // <ACE_Thread_Manager::wait>, we need to join with that thread (and + // close down the handle). +}; + +// Forward decl. +class ACE_Thread_Manager; +class ACE_Thread_Descriptor; + +class ACE_Export ACE_Thread_Adapter +{ + // = TITLE + // Converts a C++ function into a function <ace_thread_adapter> + // function that can be called from a thread creation routine + // (e.g., <pthread_create> or <_beginthreadex>) that expects an + // extern "C" entry point. This class also makes it possible to + // transparently provide hooks to register a thread with an + // <ACE_Thread_Manager>. + // + // = DESCRIPTION + // This class is used in <ACE_OS::thr_create>. In general, the + // thread that creates an object of this class is different from + // the thread that calls <invoke> on this object. Therefore, + // the <invoke> method is responsible for deleting itself. +public: + ACE_Thread_Adapter (ACE_THR_FUNC user_func, + void *arg, + ACE_THR_C_FUNC entry_point = (ACE_THR_C_FUNC) ace_thread_adapter, + ACE_Thread_Manager *thr_mgr = 0, + ACE_Thread_Descriptor *td = 0 +# if defined (ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS) + , ACE_SEH_EXCEPT_HANDLER selector = 0, + ACE_SEH_EXCEPT_HANDLER handler = 0 +# endif /* ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS */ + ); + // Constructor. + + void *invoke (void); + // Execute the <user_func_> with the <arg>. This function deletes + // <this>, thereby rendering the object useless after the call + // returns. + + ACE_Thread_Manager *thr_mgr (void); + // Accessor for the optional <Thread_Manager>. + + ACE_THR_C_FUNC entry_point (void); + // Accessor for the C entry point function to the OS thread creation + // routine. + + static void close_log_msg (void); + // Invoke the close_log_msg_hook, if it is present + + static void sync_log_msg (const ACE_TCHAR *prog_name); + // Invoke the sync_log_msg_hook, if it is present + +private: + ~ACE_Thread_Adapter (void); + // Ensure that this object must be allocated on the heap. + + void inherit_log_msg (void); + // Inherit the logging features if the parent thread has an + // <ACE_Log_Msg>. + + static ACE_INIT_LOG_MSG_HOOK init_log_msg_hook_; + static ACE_INHERIT_LOG_MSG_HOOK inherit_log_msg_hook_; + static ACE_CLOSE_LOG_MSG_HOOK close_log_msg_hook_; + static ACE_SYNC_LOG_MSG_HOOK sync_log_msg_hook_; + // The hooks to inherit and cleanup the Log_Msg attributes + + static void set_log_msg_hooks (ACE_INIT_LOG_MSG_HOOK init_hook, + ACE_INHERIT_LOG_MSG_HOOK inherit_hook, + ACE_CLOSE_LOG_MSG_HOOK close_hook, + ACE_SYNC_LOG_MSG_HOOK sync_hook); + // Set the Log_Msg hooks + + friend class ACE_Log_Msg; + // Allow the ACE_Log_Msg class to set its hooks. + +private: + ACE_THR_FUNC user_func_; + // Thread startup function passed in by the user (C++ linkage). + + void *arg_; + // Argument to thread startup function. + + ACE_THR_C_FUNC entry_point_; + // Entry point to the underlying OS thread creation call (C + // linkage). + + ACE_Thread_Manager *thr_mgr_; + // Optional thread manager. + + ACE_OS_Thread_Descriptor *thr_desc_; + // Optional thread descriptor. Passing this pointer in will force + // the spawned thread to cache this location in <Log_Msg> and wait + // until <Thread_Manager> fills in all information in thread + // descriptor. + + void *log_msg_attributes_; + // The ACE_Log_Msg attributes. + + friend class ACE_Thread_Adapter_Has_Private_Destructor; + // Friend declaration to avoid compiler warning: only defines a private + // destructor and has no friends. +}; + +# if defined (ACE_HAS_INLINED_OSCALLS) +# if defined (ACE_INLINE) +# undef ACE_INLINE +# endif /* ACE_INLINE */ +# define ACE_INLINE inline +# include "ace/Thread_Adapter.inl" +# endif /* ACE_HAS_INLINED_OSCALLS */ + +#include "ace/post.h" +#endif /* ACE_THREAD_ADAPTER_H */ |