}
if (session->bugs && !switch_channel_test_flag(session->channel, CF_PAUSE_BUGS)) {
- switch_media_bug_t *bp, *dp, *last = NULL;
+ switch_media_bug_t *bp;
switch_bool_t ok = SWITCH_TRUE;
switch_thread_rwlock_rdlock(session->bug_rwlock);
+ int prune = 0;
+
for (bp = session->bugs; bp; bp = bp->next) {
if (!switch_channel_test_flag(session->channel, CF_ANSWERED) && switch_core_media_bug_test_flag(bp, SMBF_ANSWER_REQ)) {
continue;
}
+ if (switch_test_flag(bp, SMBF_PRUNE)) {
+ prune++;
+ continue;
+ }
if (bp->ready && switch_test_flag(bp, SMBF_READ_STREAM)) {
switch_mutex_lock(bp->read_mutex);
}
}
- if (bp->stop_time && bp->stop_time <= switch_epoch_time_now(NULL)) {
- ok = SWITCH_FALSE;
+ if ((bp->stop_time && bp->stop_time <= switch_epoch_time_now(NULL)) || ok == SWITCH_FALSE) {
+ switch_set_flag(bp, SMBF_PRUNE);
+ prune++;
}
-
- if (ok == SWITCH_FALSE) {
- bp->ready = 0;
- if (last) {
- last->next = bp->next;
- } else {
- session->bugs = bp->next;
- }
- dp = bp;
- bp = last;
- switch_core_media_bug_close(&dp);
- if (!bp) {
- break;
- }
- continue;
- }
- last = bp;
+
+
}
switch_thread_rwlock_unlock(session->bug_rwlock);
+ if (prune) {
+ switch_core_media_bug_prune(session);
+ }
}
if (do_bugs) {
switch_set_flag((*frame), SFF_CNG);
}
if (session->bugs && !switch_channel_test_flag(session->channel, CF_PAUSE_BUGS)) {
- switch_media_bug_t *bp, *dp, *last = NULL;
+ switch_media_bug_t *bp;
switch_bool_t ok = SWITCH_TRUE;
+ int prune = 0;
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) {
if (!switch_channel_test_flag(session->channel, CF_ANSWERED) && switch_core_media_bug_test_flag(bp, SMBF_ANSWER_REQ)) {
continue;
}
+ if (switch_test_flag(bp, SMBF_PRUNE)) {
+ prune++;
+ continue;
+ }
+
if (bp->ready && switch_test_flag(bp, SMBF_READ_PING)) {
switch_mutex_lock(bp->read_mutex);
if (bp->callback) {
}
if (ok == SWITCH_FALSE) {
- bp->ready = 0;
- if (last) {
- last->next = bp->next;
- } else {
- session->bugs = bp->next;
- }
- dp = bp;
- bp = last;
- switch_core_media_bug_close(&dp);
- if (!bp) {
- break;
- }
- continue;
+ switch_set_flag(bp, SMBF_PRUNE);
+ prune++;
}
- last = bp;
}
switch_thread_rwlock_unlock(session->bug_rwlock);
+ if (prune) {
+ switch_core_media_bug_prune(session);
+ }
}
}
if (session->bugs && !switch_channel_test_flag(session->channel, CF_PAUSE_BUGS)) {
- switch_media_bug_t *bp, *dp, *last = NULL;
-
+ switch_media_bug_t *bp;
+ int prune = 0;
+
switch_thread_rwlock_rdlock(session->bug_rwlock);
for (bp = session->bugs; bp; bp = bp->next) {
switch_bool_t ok = SWITCH_TRUE;
continue;
}
+ if (switch_test_flag(bp, SMBF_PRUNE)) {
+ prune++;
+ continue;
+ }
+
if (switch_test_flag(bp, SMBF_WRITE_STREAM)) {
switch_mutex_lock(bp->write_mutex);
if (ok == SWITCH_FALSE) {
- bp->ready = 0;
- if (last) {
- last->next = bp->next;
- } else {
- session->bugs = bp->next;
- }
- dp = bp;
- bp = last;
- switch_core_media_bug_close(&dp);
- if (!bp) {
- break;
- }
- continue;
+ switch_set_flag(bp, SMBF_PRUNE);
+ prune++;
}
- last = bp;
}
switch_thread_rwlock_unlock(session->bug_rwlock);
+ if (prune) {
+ switch_core_media_bug_prune(session);
+ }
}
if (do_bugs) {
}
+SWITCH_DECLARE(uint32_t) switch_core_media_bug_prune(switch_core_session_t *session)
+{
+ switch_media_bug_t *bp = NULL, *last = NULL;
+ switch_status_t status = SWITCH_STATUS_FALSE;
+ int ttl = 0;
+
+
+ top:
+
+ if (session->bugs) {
+ switch_thread_rwlock_wrlock(session->bug_rwlock);
+ for (bp = session->bugs; bp; bp = bp->next) {
+ if (switch_core_media_bug_test_flag(bp, SMBF_PRUNE)) {
+ if (last) {
+ last->next = bp->next;
+ } else {
+ session->bugs = bp->next;
+ }
+ break;
+ }
+
+ last = bp;
+ }
+ switch_thread_rwlock_unlock(session->bug_rwlock);
+ if (bp) {
+ status = switch_core_media_bug_close(&bp);
+ ttl++;
+ goto top;
+ }
+ }
+
+ if (!session->bugs && switch_core_codec_ready(&session->bug_codec)) {
+ switch_core_codec_destroy(&session->bug_codec);
+ memset(&session->bug_codec, 0, sizeof(session->bug_codec));
+ }
+
+ return ttl;
+}
+
+
SWITCH_DECLARE(switch_status_t) switch_core_media_bug_remove_callback(switch_core_session_t *session, switch_media_bug_callback_t callback)
{
switch_media_bug_t *cur = NULL, *bp = NULL, *last = NULL;