diff options
Diffstat (limited to 'src/TNetLib/.svn/text-base/Thread.h.svn-base')
-rw-r--r-- | src/TNetLib/.svn/text-base/Thread.h.svn-base | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/TNetLib/.svn/text-base/Thread.h.svn-base b/src/TNetLib/.svn/text-base/Thread.h.svn-base new file mode 100644 index 0000000..ba6d7ba --- /dev/null +++ b/src/TNetLib/.svn/text-base/Thread.h.svn-base @@ -0,0 +1,53 @@ +#ifndef _TNET_THREAD_H +#define _TNET_THREAD_H + +namespace TNet { + +class Thread { + public: + Thread() + { } + virtual ~Thread() + { } + + int Start(void* arg); + + protected: + static void* EntryPoint(void*); + virtual void Execute(void*) = 0; ///< Override this function + void* Arg() const { return arg_; } + void Arg(void* a) { arg_ = a; } + + private: + pthread_t thread_id_; + void * arg_; +}; + +int Thread::Start(void * arg) { + Arg(arg); // store user data + + int ret=0; + //create thread as detached (don't wait for it) + pthread_attr_t tattr; + ret |= pthread_attr_init(&tattr); + ret |= pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED); + ret |= pthread_create(&thread_id_, &tattr, &Thread::EntryPoint, this); + if(ret != 0) KALDI_ERR << "Failed to create thread"; + return ret; +} + +/*static */ +void* Thread::EntryPoint(void* pthis) try { + Thread* pt = (Thread*)pthis; + pt->Execute(pt->Arg()); + return NULL; +} catch (std::exception& rExc) { + std::cerr << "Exception thrown" << std::endl; + std::cerr << rExc.what() << std::endl; + exit(1); +} + + +} //namespace TNet + +#endif |