b/f: separate thread for processing SIP Subscriptions (avoid deadlock on EventDispatcher)

the AmSipSubscriptionContainter thread is only started once a subscription is used.
sayer/1.4-spce2.6
Stefan Sayer 15 years ago
parent 3327473f14
commit c2f72bec46

@ -44,6 +44,9 @@ _AmSipSubscriptionContainer::~_AmSipSubscriptionContainer() {
void _AmSipSubscriptionContainer::initialize() {
if (!initialized) {
// AmEventDispatcher::instance()->addEventQueue(SUBSCRIPTION_CONTAINER_EVQ_ID, this);
initialized = true;
DBG("Starting SIP Subscription client thread ([%p])\n", this);
start();
}
}
@ -102,9 +105,9 @@ void _AmSipSubscriptionContainer::removeSubscription(const string& sub_handle) {
subscriptions_mut.unlock();
}
// AmEventQueueInterface
void _AmSipSubscriptionContainer::postEvent(AmEvent* event) {
auto_ptr<AmEvent> l_event(event);
// AmEventProcessingThread
void _AmSipSubscriptionContainer::onEvent(AmEvent* event) {
// auto_ptr<AmEvent> l_event(event);
AmSipRequestEvent* sip_req_ev = dynamic_cast<AmSipRequestEvent*>(event);
if (sip_req_ev) {

@ -30,11 +30,10 @@
#define _AmSipSubscriptionContainer_h_
#include "AmSipSubscription.h"
#include "AmEventQueue.h"
#include "AmThread.h"
#include "AmEventProcessingThread.h"
class _AmSipSubscriptionContainer
: public AmEventQueueInterface
: public AmEventProcessingThread
{
AmSipSubscriptionMap subscriptions;
AmMutex subscriptions_mut;
@ -50,8 +49,8 @@ class _AmSipSubscriptionContainer
bool refreshSubscription(const string& sub_handle, unsigned int wanted_expires=0);
void removeSubscription(const string& sub_handle);
// AmEventQueueInterface
void postEvent(AmEvent* event);
// AmEventProcessingThread
void onEvent(AmEvent* event);
};
typedef singleton<_AmSipSubscriptionContainer> AmSipSubscriptionContainer;

Loading…
Cancel
Save