00001 /*MT* 00002 00003 MediaTomb - http://www.mediatomb.cc/ 00004 00005 thread_executor.cc - this file is part of MediaTomb. 00006 00007 Copyright (C) 2005 Gena Batyan <bgeradz@mediatomb.cc>, 00008 Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc> 00009 00010 Copyright (C) 2006-2010 Gena Batyan <bgeradz@mediatomb.cc>, 00011 Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc>, 00012 Leonhard Wimmer <leo@mediatomb.cc> 00013 00014 MediaTomb is free software; you can redistribute it and/or modify 00015 it under the terms of the GNU General Public License version 2 00016 as published by the Free Software Foundation. 00017 00018 MediaTomb is distributed in the hope that it will be useful, 00019 but WITHOUT ANY WARRANTY; without even the implied warranty of 00020 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00021 GNU General Public License for more details. 00022 00023 You should have received a copy of the GNU General Public License 00024 version 2 along with MediaTomb; if not, write to the Free Software 00025 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. 00026 00027 $Id: thread_executor.cc 2081 2010-03-23 20:18:00Z lww $ 00028 */ 00029 00031 00032 #ifdef HAVE_CONFIG_H 00033 #include "autoconfig.h" 00034 #endif 00035 00036 #include "thread_executor.h" 00037 00038 using namespace zmm; 00039 00040 ThreadExecutor::ThreadExecutor() 00041 { 00042 mutex = Ref<Mutex>(new Mutex()); 00043 cond = Ref<Cond>(new Cond(mutex)); 00044 00045 threadShutdown = false; 00046 } 00047 00048 ThreadExecutor::~ThreadExecutor() 00049 { 00050 kill(); 00051 } 00052 00053 void ThreadExecutor::startThread() 00054 { 00055 threadRunning = true; 00056 pthread_create( 00057 &thread, 00058 NULL, // attr 00059 ThreadExecutor::staticThreadProc, 00060 this 00061 ); 00062 } 00063 00064 bool ThreadExecutor::kill() 00065 { 00066 if (! threadRunning) 00067 return true; 00068 AUTOLOCK(mutex); 00069 threadShutdown = true; 00070 cond->signal(); 00071 AUTOUNLOCK(); 00072 if (thread) 00073 { 00074 threadRunning = false; 00075 pthread_join(thread, NULL); 00076 } 00077 return true; 00078 } 00079 00080 void *ThreadExecutor::staticThreadProc(void *arg) 00081 { 00082 ThreadExecutor *inst = (ThreadExecutor *)arg; 00083 inst->threadProc(); 00084 pthread_exit(NULL); 00085 return NULL; 00086 }
1.6.1