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

Reply via email to