]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Fix removing sessions from linked list; fix a deadlock added in previous commit
authorAndrew Thompson <andrew@hijacked.us>
Mon, 16 Mar 2009 22:58:36 +0000 (22:58 +0000)
committerAndrew Thompson <andrew@hijacked.us>
Mon, 16 Mar 2009 22:58:36 +0000 (22:58 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12634 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c

index 54c0f977eccbde1fcf062fe408ad941d1c814810..17b228e90fa60177c5f29bad669d5a7216481455 100644 (file)
@@ -487,6 +487,7 @@ static switch_status_t check_attached_sessions(listener_t *listener)
        session_elem_t *last,*sp;
        switch_status_t status = SWITCH_STATUS_SUCCESS;
        void *pop;
+       int removed = 0;
        /* check up on all the attached sessions -
           if they have not yet sent an initial call event to the associated erlang process then do so
           if they have pending events in their queues then send them
@@ -496,6 +497,7 @@ static switch_status_t check_attached_sessions(listener_t *listener)
        sp = listener->session_list;
        last = NULL;
        while(sp) {
+               removed = 0;
                if (switch_test_flag(sp, LFLAG_WAITING_FOR_PID)) {
                        break;
                }
@@ -538,6 +540,7 @@ static switch_status_t check_attached_sessions(listener_t *listener)
                                /* this allows the application threads to exit */
                                switch_clear_flag_locked(sp, LFLAG_SESSION_ALIVE);
                                switch_core_session_rwunlock(sp->session);
+                               removed = 1;
 
                                /* TODO
                                   if this listener was created outbound, and the last session has been detached
@@ -548,7 +551,8 @@ static switch_status_t check_attached_sessions(listener_t *listener)
                        ei_x_free(&ebuf);
                        switch_event_destroy(&pevent);
                }
-               last = sp;
+               if (!removed)
+                       last = sp;
                sp = sp->next;
        }
        switch_mutex_unlock(listener->session_mutex);
@@ -1321,10 +1325,10 @@ SWITCH_STANDARD_API(erlang_cmd)
                                                stream->write_function(stream, "Outbound session for %s\n", switch_core_session_get_uuid(sp->session));
                                                sp = sp->next;
                                        }
-                                       switch_mutex_unlock(l->session_mutex);
                                } else {
                                        stream->write_function(stream, "No active sessions for %s\n", argv[1]);
                                }
+                               switch_mutex_unlock(l->session_mutex);
                                break;
                        }
                }