]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FSCORE-576
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 22 Mar 2010 16:22:19 +0000 (16:22 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 22 Mar 2010 16:22:19 +0000 (16:22 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@17065 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/private/switch_core_pvt.h
src/switch_core.c
src/switch_core_session.c

index 82631490d2d100776dd500c0828a59d03d49ac84..ef1fe80fed0ca3d6ee0370b2d0858bb36654146c 100644 (file)
@@ -127,6 +127,7 @@ struct switch_core_session {
        switch_mutex_t *codec_read_mutex;
        switch_mutex_t *codec_write_mutex;
        switch_thread_cond_t *cond;
+       switch_mutex_t *frame_read_mutex;
 
        switch_thread_rwlock_t *rwlock;
 
index cbaad6a753193af0dee62c884027bef6efbca2d9..fe0ffcbaba1605d0bc857d5e8641b81f55ae9ddb 100644 (file)
@@ -308,7 +308,7 @@ SWITCH_DECLARE(char *) switch_core_get_uuid(void)
 }
 
 
-static void *switch_core_service_thread(switch_thread_t *thread, void *obj)
+static void *SWITCH_THREAD_FUNC switch_core_service_thread(switch_thread_t *thread, void *obj)
 {
        switch_core_session_t *session = obj;
        switch_channel_t *channel;
@@ -321,6 +321,8 @@ static void *switch_core_service_thread(switch_thread_t *thread, void *obj)
                return NULL;
        }
 
+       switch_mutex_lock(session->frame_read_mutex);
+
        channel = switch_core_session_get_channel(session);
 
        switch_channel_set_flag(channel, CF_SERVICE);
@@ -336,7 +338,10 @@ static void *switch_core_service_thread(switch_thread_t *thread, void *obj)
                }
        }
 
+       switch_mutex_unlock(session->frame_read_mutex);
+
        switch_core_session_rwunlock(session);
+
        return NULL;
 }
 
@@ -360,7 +365,7 @@ SWITCH_DECLARE(void) switch_core_service_session(switch_core_session_t *session)
        channel = switch_core_session_get_channel(session);
        switch_assert(channel);
 
-       switch_core_session_launch_thread(session, switch_core_service_thread, session);
+       switch_core_session_launch_thread(session, (void *(*)(switch_thread_t *,void *))switch_core_service_thread, session);
 }
 
 /* This function abstracts the thread creation for modules by allowing you to pass a function ptr and
index 2cbed0216373ad277d4a9d95e17b40667dc88d44..9dd3208d93eb22b8e2f1def595355258a2e66df6 100644 (file)
@@ -1558,6 +1558,7 @@ SWITCH_DECLARE(switch_core_session_t *) switch_core_session_request_uuid(switch_
        switch_mutex_init(&session->resample_mutex, SWITCH_MUTEX_NESTED, session->pool);
        switch_mutex_init(&session->codec_read_mutex, SWITCH_MUTEX_NESTED, session->pool);
        switch_mutex_init(&session->codec_write_mutex, SWITCH_MUTEX_NESTED, session->pool);
+       switch_mutex_init(&session->frame_read_mutex, SWITCH_MUTEX_NESTED, session->pool);
        switch_thread_rwlock_create(&session->bug_rwlock, session->pool);
        switch_thread_cond_create(&session->cond, session->pool);
        switch_thread_rwlock_create(&session->rwlock, session->pool);