MFLAG_CAN_HEAR = (1 << 2),
MFLAG_KICKED = (1 << 3),
MFLAG_ITHREAD = (1 << 4),
- MFLAG_NOCHANNEL = (1 << 5)
+ MFLAG_NOCHANNEL = (1 << 5),
+ MFLAG_INTREE = (1 << 6)
} member_flag_t;
typedef enum {
uint32_t interval;
switch_mutex_t *mutex;
conference_member_t *members;
- switch_mutex_t *member_mutex;
+ switch_thread_rwlock_t *member_rwlock;
conference_file_node_t *fnode;
switch_memory_pool_t *pool;
switch_thread_rwlock_t *rwlock;
assert(conference != NULL);
assert(id != 0);
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
for(member = conference->members; member; member = member->next) {
if (switch_test_flag(member, MFLAG_NOCHANNEL)) {
break;
}
}
-
+
+ if (member && !switch_test_flag(member, MFLAG_INTREE)) {
+ member = NULL;
+ }
+
+ switch_thread_rwlock_unlock(conference->member_rwlock);
return member;
}
int count = 0;
assert (conference != NULL);
-
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
for(member = conference->members; member; member = member->next) {
if (switch_test_flag(member, MFLAG_NOCHANNEL) && (!path || !strcmp(path, member->rec_path))) {
switch_clear_flag_locked(member, MFLAG_RUNNING);
count++;
}
}
-
+ switch_thread_rwlock_unlock(conference->member_rwlock);
return count;
}
assert(member != NULL);
switch_mutex_lock(conference->mutex);
- switch_mutex_lock(conference->member_mutex);
+ switch_thread_rwlock_wrlock(conference->member_rwlock);
switch_mutex_lock(member->audio_in_mutex);
switch_mutex_lock(member->audio_out_mutex);
switch_mutex_lock(member->flag_mutex);
member->next = conference->members;
member->energy_level = conference->energy_level;
conference->members = member;
-
+ switch_set_flag(member, MFLAG_INTREE);
if (!switch_test_flag(member, MFLAG_NOCHANNEL)) {
conference->count++;
switch_mutex_unlock(member->flag_mutex);
switch_mutex_unlock(member->audio_out_mutex);
switch_mutex_unlock(member->audio_in_mutex);
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
switch_mutex_unlock(conference->mutex);
status = SWITCH_STATUS_SUCCESS;
assert(conference != NULL);
assert(member != NULL);
-
-
-
switch_mutex_lock(conference->mutex);
- switch_mutex_lock(conference->member_mutex);
+ switch_thread_rwlock_wrlock(conference->member_rwlock);
switch_mutex_lock(member->audio_in_mutex);
switch_mutex_lock(member->audio_out_mutex);
switch_mutex_lock(member->flag_mutex);
-
+ switch_clear_flag(member, MFLAG_INTREE);
+
for (imember = conference->members; imember; imember = imember->next) {
if (imember == member ) {
if (last) {
switch_mutex_unlock(member->flag_mutex);
switch_mutex_unlock(member->audio_out_mutex);
switch_mutex_unlock(member->audio_in_mutex);
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
switch_mutex_unlock(conference->mutex);
status = SWITCH_STATUS_SUCCESS;
ready = 0;
/* Read one frame of audio from each member channel and save it for redistribution */
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
for (imember = conference->members; imember; imember = imember->next) {
if (imember->buflen) {
memset(imember->frame, 255, imember->buflen);
}
switch_mutex_unlock(imember->audio_in_mutex);
}
-
+ switch_thread_rwlock_unlock(conference->member_rwlock);
/* If a file or speech event is being played */
if (conference->fnode) {
/* Lead in time */
if (ready) {
/* Build a muxed frame for every member that contains the mixed audio of everyone else */
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
for (omember = conference->members; omember; omember = omember->next) {
omember->len = bytes;
if (conference->fnode) {
switch_mutex_unlock(imember->audio_out_mutex);
}
}
+ switch_thread_rwlock_unlock(conference->member_rwlock);
if (conference->fnode && conference->fnode->done) {
conference_file_node_t *fnode;
conference->fnode = NULL;
}
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
for(imember = conference->members; imember; imember = imember->next) {
switch_channel_t *channel;
switch_clear_flag_locked(imember, MFLAG_RUNNING);
}
+ switch_thread_rwlock_unlock(conference->member_rwlock);
switch_mutex_unlock(conference->mutex);
launch_conference_loop_input(member, switch_core_session_get_pool(member->session));
/* build a digit stream object */
- if (member->conference->dtmf_parser != NULL && switch_ivr_digit_stream_new(member->conference->dtmf_parser, &member->digit_stream) != SWITCH_STATUS_SUCCESS) {
+ if (member->conference->dtmf_parser != NULL &&
+ switch_ivr_digit_stream_new(member->conference->dtmf_parser, &member->digit_stream) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Warning Will Robinson, there is no digit parser stream object\n");
}
assert(conference != NULL);
switch_mutex_lock(conference->mutex);
- switch_mutex_lock(conference->member_mutex);
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
count = conference->count;
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
switch_mutex_unlock(conference->mutex);
if (!count) {
return SWITCH_STATUS_GENERR;
}
-
-
switch_mutex_lock(conference->mutex);
- switch_mutex_lock(conference->member_mutex);
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
count = conference->count;
if (!(conference->tts_engine && conference->tts_voice)) {
count = 0;
}
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
switch_mutex_unlock(conference->mutex);
if (!count) {
assert(stream != NULL);
assert(pfncallback != NULL);
- switch_mutex_lock(conference->member_mutex);
-
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
for (member = conference->members; member; member = member->next) {
pfncallback(member, stream, data);
}
-
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
}
assert(conference != NULL);
assert(stream != NULL);
- switch_mutex_lock(conference->member_mutex);
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
// stream->write_function(stream, "<pre>Current Callers:\n");
for (member = conference->members; member; member = member->next) {
}
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
}
assert(delim != NULL);
- switch_mutex_lock(conference->member_mutex);
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
for (member = conference->members; member; member = member->next) {
switch_channel_t *channel;
member->energy_level);
}
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
}
uint32_t id = atoi(argv[2]);
uint32_t oid = atoi(argv[3]);
- switch_mutex_lock(conference->mutex);
- switch_mutex_lock(conference->member_mutex);
if ((member = conference_member_get(conference, id))) {
member_del_relationship(member, oid);
stream->write_function(stream, "relationship %u->%u cleared.", id, oid);
} else {
stream->write_function(stream, "relationship %u->%u not found", id, oid);
}
- switch_mutex_unlock(conference->member_mutex);
- switch_mutex_unlock(conference->mutex);
} else if (nospeak || nohear) {
conference_member_t *member = NULL, *other_member = NULL;
uint32_t id = atoi(argv[2]);
uint32_t oid = atoi(argv[3]);
- switch_mutex_lock(conference->mutex);
- switch_mutex_lock(conference->member_mutex);
if ((member = conference_member_get(conference, id)) && (other_member = conference_member_get(conference, oid))) {
conference_relationship_t *rel = NULL;
if ((rel = member_get_relationship(member, other_member))) {
} else {
stream->write_function(stream, "relationship %u->%u not found", id, oid);
}
- switch_mutex_unlock(conference->member_mutex);
- switch_mutex_unlock(conference->mutex);
}
}
conference_member_t *member = NULL;
conference_member_t *last_member = NULL;
- switch_mutex_lock(conference->member_mutex);
+ switch_thread_rwlock_rdlock(conference->member_rwlock);
/* find last (oldest) member */
member = conference->members;
pfn(last_member, stream, argv[argn+2]);
}
- switch_mutex_unlock(conference->member_mutex);
+ switch_thread_rwlock_unlock(conference->member_rwlock);
} else {
conf_api_member_cmd_t pfn = (conf_api_member_cmd_t)conf_api_sub_commands[i].pfnapicmd;
conference_member_t *member = conference_member_get(conference, id);
/* Activate the conference mutex for exclusivity */
switch_mutex_init(&conference->mutex, SWITCH_MUTEX_NESTED, conference->pool);
- switch_mutex_init(&conference->member_mutex, SWITCH_MUTEX_NESTED, conference->pool);
switch_mutex_init(&conference->flag_mutex, SWITCH_MUTEX_NESTED, conference->pool);
switch_thread_rwlock_create(&conference->rwlock, conference->pool);
+ switch_thread_rwlock_create(&conference->member_rwlock, conference->pool);
return conference;
}