1// 2// This file is part of the aMule Project. 3// 4// Copyright (c) 2005-2011 aMule Team ( admin@amule.org / http://www.amule.org ) 5// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) 6// 7// Any parts of this program derived from the xMule, lMule or eMule project, 8// or contributed by third-party developers are copyrighted by their 9// respective authors. 10// 11// This program is free software; you can redistribute it and/or modify 12// it under the terms of the GNU General Public License as published by 13// the Free Software Foundation; either version 2 of the License, or 14// (at your option) any later version. 15// 16// This program is distributed in the hope that it will be useful, 17// but WITHOUT ANY WARRANTY; without even the implied warranty of 18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19// GNU General Public License for more details. 20// 21// You should have received a copy of the GNU General Public License 22// along with this program; if not, write to the Free Software 23// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 24// 25 26// 27// Generic state machine implementation 28// 29 30#ifndef STATE_MACHINE_H 31#define STATE_MACHINE_H 32 33#include <queue> 34 35#include <wx/thread.h> /* For wxMutex, wxMutexLocker */ 36#include <wx/string.h> /* For wxString */ 37 38typedef unsigned int t_sm_state; 39 40typedef unsigned int t_sm_event; 41 42class CStateMachine 43{ 44public: 45 CStateMachine( 46 const wxString &name, 47 const unsigned int maxStates, 48 const t_sm_state initialState ); 49 virtual ~CStateMachine() = 0; 50 void Clock(); 51 void Schedule(t_sm_event event); 52 t_sm_state GetState() const { return m_state; } 53 unsigned int GetClocksInCurrentState() const { return m_clocksInCurrentState; } 54 virtual t_sm_state next_state(t_sm_event event) = 0; 55 virtual void process_state(t_sm_state state, bool entry) = 0; 56 57private: 58 void flush_queue(); 59 60 t_sm_state m_state; 61 wxMutex m_stateMutex; 62 std::queue <t_sm_event> m_queue; 63 wxMutex m_queueMutex; 64 const wxString m_name; 65 const unsigned int m_maxStates; 66 const unsigned int m_initialState; 67 unsigned int m_clockCounter; 68 unsigned int m_clocksInCurrentState; 69}; 70 71#endif // STATE_MACHINE_H 72// File_checked_for_headers 73