Re #1420: Releases the mutex before invoking the callback from the worker thread.



git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@3899 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjmedia/src/pjmedia/event.c b/pjmedia/src/pjmedia/event.c
index c499eaa..10df2b5 100644
--- a/pjmedia/src/pjmedia/event.c
+++ b/pjmedia/src/pjmedia/event.c
@@ -87,7 +87,8 @@
 
 static pj_status_t event_mgr_distribute_events(pjmedia_event_mgr *mgr,
                                                event_queue *ev_queue,
-                                               esub **next_sub)
+                                               esub **next_sub,
+                                               pj_bool_t rls_lock)
 {
     pj_status_t err = PJ_SUCCESS;
     esub * sub = mgr->esub_list.next;
@@ -100,9 +101,19 @@
          * receiving the event from the publisher.
          */
         if (sub->epub == ev->epub || !sub->epub) {
-            pj_status_t status = (*sub->cb)(ev, sub->user_data);
+            pjmedia_event_cb *cb = sub->cb;
+            void *user_data = sub->user_data;
+            pj_status_t status;
+            
+            if (rls_lock)
+                pj_mutex_unlock(mgr->mutex);
+
+            status = (*cb)(ev, user_data);
             if (status != PJ_SUCCESS && err == PJ_SUCCESS)
 	        err = status;
+
+            if (rls_lock)
+                pj_mutex_lock(mgr->mutex);
         }
 	sub = *next_sub;
     }
@@ -127,7 +138,8 @@
             break;
 
         pj_mutex_lock(mgr->mutex);
-        event_mgr_distribute_events(mgr, &mgr->ev_queue, &mgr->th_next_sub);
+        event_mgr_distribute_events(mgr, &mgr->ev_queue,
+                                    &mgr->th_next_sub, PJ_TRUE);
         pj_mutex_unlock(mgr->mutex);
     }
 
@@ -346,7 +358,8 @@
 
             do {
                 status = event_mgr_distribute_events(mgr, mgr->pub_ev_queue,
-                                                     &mgr->pub_next_sub);
+                                                     &mgr->pub_next_sub,
+                                                     PJ_FALSE);
                 if (status != PJ_SUCCESS && err == PJ_SUCCESS)
 	            err = status;
             } while(ev_queue.head != ev_queue.tail || ev_queue.is_full);