From: <ro...@us...> - 2012-02-24 14:05:09
|
Revision: 2660 http://nscldaq.svn.sourceforge.net/nscldaq/?rev=2660&view=rev Author: ron-fox Date: 2012-02-24 14:04:58 +0000 (Fri, 24 Feb 2012) Log Message: ----------- Add synchthreads Added Paths: ----------- branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.cpp branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.h Added: branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.cpp =================================================================== --- branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.cpp (rev 0) +++ branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.cpp 2012-02-24 14:04:58 UTC (rev 2660) @@ -0,0 +1,67 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2009. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#include <CSynchronizedThread.h> +/** + * Creation just chains to the base class construtor. + */ +CSynchronizedThread::CSynchronizedThread() + : Thread() +{} + +/** + * Destructor only exists to chain destructors: + */ +CSynchronizedThread::~CSynchronizedThread() +{ +} + +/** + * Start the thread by locking the mutex, invoking the base class start and waiting on the condition + * variable + */ +void +CSynchronizedThread::start() +{ + m_mutex.lock(); + + Thread::start(); + + m_conditionVar.wait(m_mutex); + m_mutex.unlock(); +} +/** + * Gets control when the thread starts. + * - Invoke init + * - Signal the condition. + * - release the mutex, + * - invoke operator() + */ +void +CSynchronizedThread::run() +{ + m_mutex.lock(); + init(); // Do thread unsafe initialization. + m_conditionVar.signal(); + m_mutex.unlock(); + operator()(); + +} + +/** + * No op in case someone wants to use this thread as a normal thread: + */ +void +CSynchronizedThread::init() {} Added: branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.h =================================================================== --- branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.h (rev 0) +++ branches/nextgen-ccusb-userdrivers-feature/base/thread/CSynchronizedThread.h 2012-02-24 14:04:58 UTC (rev 2660) @@ -0,0 +1,62 @@ +#ifndef __CSYNCHRONIZEDTHREAD_H +#define __CSYNCHRONIZEDTHREAD_H +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2009. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef DAQHWYAPI_THREAD_H +#include <Thread.h> +#endif + +#ifndef __CMUTEX_H +#include <CMutex.h> +#endif + +#ifndef __CCONDITION_H +#include <CCondition.h> +#endif + +/** + * This is an encapsulation of a thread that has some initialization that may be + * inherently thread-unsafe. The idea is that the start method is that we override + * start() so that it takes out a mutex, starts the thread and then waits on a condition + * variable tied to the thread. The run() method is also overriddent to + * first invoke the init() method and then signal the condition variable prior to + * invoking an operator() method that is the actual main body of the thread. + * + */ +class CSynchronizedThread : public Thread +{ + // The synchronization data structures: +private: + CMutex m_mutex; + CConditionVariable m_conditionVar; +public: + CSynchronizedThread(); + virtual ~CSynchronizedThread(); + + // External interface: + +public: + void start(); + virtual void run(); + virtual void init(); + virtual void operator()() = 0; + + +}; + + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |