]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
finish up mutex app
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 29 Aug 2012 06:01:14 +0000 (01:01 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 29 Aug 2012 06:01:14 +0000 (01:01 -0500)
src/mod/applications/mod_dptools/mod_dptools.c

index e91ca90665c1104641ef710039aee07dd413d098..d71bf14059c9da6b571d26035b9b2f3156bdb5fe 100755 (executable)
@@ -4609,7 +4609,7 @@ static void cancel(switch_core_session_t *session, master_mutex_t *master)
        
        switch_mutex_lock(globals.mutex_mutex);
        for (np = master->list; np; np = np->next) {
-               if (np->session == session) {
+               if (np && np->session == session) {
                        switch_core_event_hook_remove_state_change(session, mutex_hanguphook);
                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s mutex %s canceled\n", 
                                                          switch_core_session_get_name(session), master->key);
@@ -4644,6 +4644,7 @@ static void advance(master_mutex_t *master)
                                                  "%s mutex %s advanced\n", switch_channel_get_name(channel), master->key);
                switch_channel_set_app_flag_key(master->key, channel, MUTEX_FLAG_SET);
                switch_channel_clear_app_flag_key(master->key, channel, MUTEX_FLAG_WAIT);
+               switch_core_event_hook_add_state_change(master->list->session, mutex_hanguphook);
        }
 
 
@@ -4669,7 +4670,7 @@ static void confirm(switch_core_session_t *session, master_mutex_t *master)
                switch_core_event_hook_remove_state_change(session, mutex_hanguphook);
                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s mutex %s cleared\n", switch_channel_get_name(channel), master->key);
                advance(master);
-       } else if (switch_channel_test_app_flag_key(master->key, channel, MUTEX_FLAG_WAIT)) {
+       } else {
                cancel(session, master);
        }
 }
@@ -4685,6 +4686,8 @@ static switch_status_t mutex_hanguphook(switch_core_session_t *session)
                return SWITCH_STATUS_SUCCESS;
        }
 
+       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s mutex hangup hook\n", switch_channel_get_name(channel));
+
        confirm(session, NULL);
        switch_core_event_hook_remove_state_change(session, mutex_hanguphook);
 
@@ -4714,19 +4717,29 @@ static switch_bool_t do_mutex(switch_core_session_t *session, const char *key, s
                switch_mutex_unlock(globals.mutex_mutex);
                return SWITCH_FALSE;
        }
-
+       
        if (!(master = switch_core_hash_find(globals.mutex_hash, key))) {
                master = switch_core_alloc(globals.pool, sizeof(*master));
                master->key = switch_core_strdup(globals.pool, key);
+               master->list = NULL;
+               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "NEW MASTER %s %p\n", key, (void *) master);
                switch_core_hash_insert(globals.mutex_hash, key, master);
+       } else {
+               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "EXIST MASTER %s %p\n", key, (void *) master);
        }
                
        if (on) {
+               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "HIT ON\n");
+
                node = switch_core_session_alloc(session, sizeof(*node));
                node->session = session;
 
+               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "CHECK MASTER LIST %p\n", (void *) master->list);
+
                for (np = master->list; np && np->next; np = np->next);
 
+               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "HIT ON np %p\n", (void *) np);
+
                if (np) {
                        np->next = node;
                        switch_channel_set_app_flag_key(key, channel, MUTEX_FLAG_WAIT);
@@ -4803,6 +4816,8 @@ static switch_bool_t do_mutex(switch_core_session_t *session, const char *key, s
                cancel(session, master);
        } else {
                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s mutex %s acquired\n", switch_channel_get_name(channel), key);
+               switch_core_event_hook_add_state_change(session, mutex_hanguphook);
+               switch_channel_set_private(channel, "_mutex_master", master);
        }
        switch_mutex_unlock(globals.mutex_mutex);
 
@@ -4871,9 +4886,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load)
        switch_file_interface_t *file_interface;
 
        globals.pool = pool;
-       switch_core_hash_init(&globals.pickup_hash, NULL);
+       switch_core_hash_init(&globals.pickup_hash, globals.pool);
        switch_mutex_init(&globals.pickup_mutex, SWITCH_MUTEX_NESTED, globals.pool);
-       switch_core_hash_init(&globals.mutex_hash, NULL);
+       switch_core_hash_init(&globals.mutex_hash, globals.pool);
        switch_mutex_init(&globals.mutex_mutex, SWITCH_MUTEX_NESTED, globals.pool);
 
        /* connect my internal structure to the blank pointer passed to me */