EMIPLIB

mipinterchaintimer.h

Go to the documentation of this file.
00001 /*
00002     
00003   This file is a part of EMIPLIB, the EDM Media over IP Library.
00004   
00005   Copyright (C) 2006-2011  Hasselt University - Expertise Centre for
00006                       Digital Media (EDM) (http://www.edm.uhasselt.be)
00007 
00008   This library is free software; you can redistribute it and/or
00009   modify it under the terms of the GNU Lesser General Public
00010   License as published by the Free Software Foundation; either
00011   version 2.1 of the License, or (at your option) any later version.
00012 
00013   This library is distributed in the hope that it will be useful,
00014   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016   Lesser General Public License for more details.
00017 
00018   You should have received a copy of the GNU Lesser General Public
00019   License along with this library; if not, write to the Free Software
00020   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
00021   USA
00022 
00023 */
00024 
00029 #ifndef MIPINTERCHAINTIMER_H
00030 
00031 #define MIPINTERCHAINTIMER_H
00032 
00033 #include "mipconfig.h"
00034 #include "mipcomponent.h"
00035 #include "mipsystemmessage.h"
00036 #include "mipsignalwaiter.h"
00037 #include "miptime.h"
00038 #include <jthread/jthread.h>
00039 
00047 class EMIPLIB_IMPORTEXPORT MIPInterChainTimer : public MIPComponent
00048 {
00049 public:
00050         MIPInterChainTimer();
00051         ~MIPInterChainTimer();
00052         
00073         bool init(int count = 1, MIPTime safetyTimeout = MIPTime(0.5));
00074         
00076         bool destroy();
00077 
00082         MIPComponent *getTriggerComponent();
00083 
00084         bool push(const MIPComponentChain &chain, int64_t iteration, MIPMessage *pMsg);
00085         bool pull(const MIPComponentChain &chain, int64_t iteration, MIPMessage **pMsg);
00086 private:
00087         class TriggerComponent : public MIPComponent, public jthread::JThread
00088         {
00089         public:
00090                 TriggerComponent(MIPSignalWaiter &sigWait, int count) : MIPComponent("MIPInterChainTimer::TriggerComponent"), m_sigWait(sigWait)
00091                 {
00092                         m_targetCount = count;
00093                         m_counter = 0;
00094                 }
00095 
00096                 ~TriggerComponent()
00097                 {
00098                         stopSafetyThread();
00099                 }
00100                 
00101                 bool startSafetyThread(MIPTime timeout);
00102                 void stopSafetyThread();
00103                 
00104                 bool push(const MIPComponentChain &chain, int64_t iteration, MIPMessage *pMsg);
00105                 bool pull(const MIPComponentChain &chain, int64_t iteration, MIPMessage **pMsg);
00106         private:
00107                 void *Thread();
00108 
00109                 MIPSignalWaiter &m_sigWait;
00110                 int m_targetCount;
00111                 int m_counter;
00112                 MIPTime m_prevTime;
00113                 MIPTime m_timeout;
00114                 jthread::JMutex m_stopMutex;
00115                 bool m_stopThread;
00116         };
00117 
00118         MIPSignalWaiter m_sigWait;
00119         TriggerComponent *m_pTriggerComp;
00120         bool m_init;
00121         MIPSystemMessage m_timeMsg;
00122         bool m_gotMsg;
00123         int64_t m_prevIteration;
00124 };
00125 
00126 #endif // MIPINTERCHAINTIMER_H
00127