summaryrefslogtreecommitdiff
path: root/src/TNetLib/Thread.h
diff options
context:
space:
mode:
authorJoe Zhao <ztuowen@gmail.com>2014-04-14 08:14:45 +0800
committerJoe Zhao <ztuowen@gmail.com>2014-04-14 08:14:45 +0800
commitcccccbf6cca94a3eaf813b4468453160e91c332b (patch)
tree23418cb73a10ae3b0688681a7f0ba9b06424583e /src/TNetLib/Thread.h
downloadtnet-cccccbf6cca94a3eaf813b4468453160e91c332b.tar.gz
tnet-cccccbf6cca94a3eaf813b4468453160e91c332b.tar.bz2
tnet-cccccbf6cca94a3eaf813b4468453160e91c332b.zip
First commit
Diffstat (limited to 'src/TNetLib/Thread.h')
-rw-r--r--src/TNetLib/Thread.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/TNetLib/Thread.h b/src/TNetLib/Thread.h
new file mode 100644
index 0000000..ba6d7ba
--- /dev/null
+++ b/src/TNetLib/Thread.h
@@ -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