use cond mutex in modem thread

This commit is contained in:
Anthony Minessale 2011-12-08 15:36:21 -06:00
parent 2e6b55810f
commit f2f0eae576
2 changed files with 28 additions and 3 deletions

View File

@ -299,6 +299,9 @@ int modem_init(modem_t *modem, modem_control_handler_t control_handler)
switch_set_flag(modem, MODEM_FLAG_RUNNING);
switch_mutex_init(&modem->mutex, SWITCH_MUTEX_NESTED, globals.pool);
switch_mutex_init(&modem->cond_mutex, SWITCH_MUTEX_NESTED, globals.pool);
switch_thread_cond_create(&modem->cond, globals.pool);
modem_set_state(modem, MODEM_STATE_INIT);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Modem [%s]->[%s] Ready\n", modem->devlink, modem->stty);
@ -947,6 +950,13 @@ static switch_status_t create_session(switch_core_session_t **new_session, modem
return status;
}
static void wake_modem_thread(modem_t *modem)
{
if (switch_mutex_trylock(modem->cond_mutex) == SWITCH_STATUS_SUCCESS) {
switch_thread_cond_signal(modem->cond);
switch_mutex_unlock(modem->cond_mutex);
}
}
static int control_handler(modem_t *modem, const char *num, int op)
{
@ -968,7 +978,8 @@ static int control_handler(modem_t *modem, const char *num, int op)
"Modem %s [%s] - Dialing '%s'\n", modem->devlink, modem_state2name(modem_get_state(modem)), num);
modem_set_state(modem, MODEM_STATE_DIALING);
switch_clear_flag(modem, MODEM_FLAG_XOFF);
wake_modem_thread(modem);
switch_set_string(modem->digits, num);
if (create_session(&session, modem) != SWITCH_STATUS_SUCCESS) {
@ -991,6 +1002,7 @@ static int control_handler(modem_t *modem, const char *num, int op)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,
"Modem %s [%s] - Hanging up\n", modem->devlink, modem_state2name(modem_get_state(modem)));
switch_clear_flag(modem, MODEM_FLAG_XOFF);
wake_modem_thread(modem);
modem_set_state(modem, MODEM_STATE_HANGUP);
@ -1031,6 +1043,7 @@ static int control_handler(modem_t *modem, const char *num, int op)
x[0] = 0x11;
t31_at_tx_handler(&modem->t31_state->at_state, modem, x, 1);
switch_clear_flag(modem, MODEM_FLAG_XOFF);
wake_modem_thread(modem);
} else {
x[0] = 0x13;
t31_at_tx_handler(&modem->t31_state->at_state, modem, x, 1);
@ -1181,6 +1194,8 @@ static void *SWITCH_THREAD_FUNC modem_thread(switch_thread_t *thread, void *obj)
globals.THREADCOUNT++;
switch_mutex_unlock(globals.mutex);
switch_mutex_lock(modem->cond_mutex);
while (switch_test_flag(modem, MODEM_FLAG_RUNNING)) {
r = modem_wait_sock(modem->master, -1, MODEM_POLL_READ | MODEM_POLL_ERROR);
@ -1196,10 +1211,16 @@ static void *SWITCH_THREAD_FUNC modem_thread(switch_thread_t *thread, void *obj)
modem->last_event = switch_time_now();
if (switch_test_flag(modem, MODEM_FLAG_XOFF)) {
switch_thread_cond_wait(modem->cond, modem->cond_mutex);
modem->last_event = switch_time_now();
}
avail = sizeof(buf) - modem->t31_state->tx.in_bytes + modem->t31_state->tx.out_bytes - 1;
if (avail == 0 || switch_test_flag(modem, MODEM_FLAG_XOFF)) {
switch_yield(100000);
if (avail == 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Buffer Full, retrying....\n");
switch_yield(10000);
continue;
}
@ -1221,6 +1242,8 @@ static void *SWITCH_THREAD_FUNC modem_thread(switch_thread_t *thread, void *obj)
}
}
switch_mutex_unlock(modem->cond_mutex);
if (switch_test_flag(modem, MODEM_FLAG_RUNNING)) {
modem_close(modem);
}

View File

@ -103,6 +103,8 @@ struct modem {
char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1];
switch_time_t last_event;
int slot;
switch_thread_cond_t *cond;
switch_mutex_t *cond_mutex;
};
typedef struct modem modem_t;