summaryrefslogtreecommitdiff
path: root/src/TNetLib/.svn/text-base/Thread.h.svn-base
diff options
context:
space:
mode:
Diffstat (limited to 'src/TNetLib/.svn/text-base/Thread.h.svn-base')
-rw-r--r--src/TNetLib/.svn/text-base/Thread.h.svn-base53
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