Module: sems Branch: master Commit: 9d506407ac497877f46b765d3fc4342ecb838ae9 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=9d506407ac497877f46b765d3fc4342ecb838ae9
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Wed Sep 14 12:10:12 2011 +0200 added EventProcessingThread AmEventProcessingThread processes events posted in the event queue until either server shutdown is signaled or processing is requested to stop with the stop_processing function. Override the onEvent(AmEvent* ev) method, create an object, start() it and post events to it. If you need queue policing (e.g. overflow protection), override police_event() function. --- core/AmEventProcessingThread.cpp | 88 ++++++++++++++++++++++++++++++++++++++ core/AmEventProcessingThread.h | 75 ++++++++++++++++++++++++++++++++ core/AmEventQueue.h | 2 +- 3 files changed, 164 insertions(+), 1 deletions(-) diff --git a/core/AmEventProcessingThread.cpp b/core/AmEventProcessingThread.cpp new file mode 100644 index 0000000..b4c79a8 --- /dev/null +++ b/core/AmEventProcessingThread.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2011 Stefan Sayer + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * [email protected] + * + * SEMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "AmEventProcessingThread.h" +#include "log.h" + +AmEventProcessingThread::AmEventProcessingThread() + : AmEventQueue(this), + processing_events(true) +{ +} + +AmEventProcessingThread::~AmEventProcessingThread() { +} + +bool AmEventProcessingThread::police_event(AmEvent* ev) { + // default: accept all events + return true; +} + +void AmEventProcessingThread::postEvent(AmEvent* ev) { + if (police_event(ev)) { + AmEventQueue::postEvent(ev); + } else { + DBG("dropping event [%p] due to policing\n", ev); + delete ev; + } +} + +void AmEventProcessingThread::on_stop() { + DBG("AmEventProcessingThread::on_stop\n"); +} + +void AmEventProcessingThread::run() { + DBG("AmEventProcessingThread running...\n"); + + while (processing_events) { + waitForEvent(); + processEvents(); + } + + DBG("AmEventProcessingThread stopping.\n"); +} + +void AmEventProcessingThread::stop_processing() { + DBG("stop of event processing requested.\n"); + processing_events = false; +} + +void AmEventProcessingThread::process(AmEvent* ev) { + + // check for shutdown + if (ev->event_id == E_SYSTEM) { + AmSystemEvent* sys_ev = dynamic_cast<AmSystemEvent*>(ev); + if(sys_ev){ + DBG("received system Event\n"); + if (sys_ev->sys_event == AmSystemEvent::ServerShutdown) { + DBG("received system Event: ServerShutdown. Stopping event processing.\n"); + processing_events = false; + } + } + } + + onEvent(ev); +} + diff --git a/core/AmEventProcessingThread.h b/core/AmEventProcessingThread.h new file mode 100644 index 0000000..20c4063 --- /dev/null +++ b/core/AmEventProcessingThread.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2011 Stefan Sayer + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * [email protected] + * + * SEMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _AmEventProcessingThread_h_ +#define _AmEventProcessingThread_h_ + +#include "AmThread.h" +#include "AmEventQueue.h" +#include "AmEvent.h" + + +/** + AmEventProcessingThread processes events posted + in the event queue until either server shutdown + is signaled or processing is requested to stop + with the stop_processing function. + + Override the onEvent(AmEvent* ev) method, create + an object, start() it and post events to it. + + If you need queue policing (e.g. overflow protection), + override police_event() function. + */ + +class AmEventProcessingThread +: public AmThread, + public AmEventQueue, + public AmEventHandler +{ + + bool processing_events; + + void process(AmEvent* ev); + + protected: + void run(); + void on_stop(); + + virtual void onEvent(AmEvent* ev) { } + + virtual bool police_event(AmEvent* ev); + + public: + AmEventProcessingThread(); + ~AmEventProcessingThread(); + + void postEvent(AmEvent* ev); + + void stop_processing(); + +}; + +#endif diff --git a/core/AmEventQueue.h b/core/AmEventQueue.h index 4c6467b..c08e8b0 100644 --- a/core/AmEventQueue.h +++ b/core/AmEventQueue.h @@ -71,7 +71,7 @@ public: AmEventQueue(AmEventHandler* handler); virtual ~AmEventQueue(); - void postEvent(AmEvent*); + virtual void postEvent(AmEvent*); void processEvents(); void waitForEvent(); void wakeup(); _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
