Revision
15573
Author
crienzo
Date
2009-11-20 11:32:47 -0600 (Fri, 20 Nov 2009)

Log Message

switch_thread_cond_timedwait corrections for mod_unimrcp

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c (15572 => 15573)


--- freeswitch/trunk/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c	2009-11-20 17:29:59 UTC (rev 15572)
+++ freeswitch/trunk/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c	2009-11-20 17:32:47 UTC (rev 15573)
@@ -666,19 +666,18 @@
 
 	/* wait for data, if allowed */
 	if (block) {
-		if (switch_buffer_inuse(queue->buffer) < requested) {
+		while (switch_buffer_inuse(queue->buffer) < requested) {
 			queue->waiting = requested;
-			switch_thread_cond_timedwait(queue->cond, queue->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
-			if (switch_buffer_inuse(queue->buffer) < requested) {
-				requested = switch_buffer_inuse(queue->buffer);
+			if (switch_thread_cond_timedwait(queue->cond, queue->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+				break;
 			}
 		}
 		queue->waiting = 0;
-	} else {
-		if (switch_buffer_inuse(queue->buffer) < requested) {
-			requested = switch_buffer_inuse(queue->buffer);
-		}
 	}
+		
+	if (switch_buffer_inuse(queue->buffer) < requested) {
+		requested = switch_buffer_inuse(queue->buffer);
+	}
 	if (requested == 0) {
 		*data_len = 0;
 		status = SWITCH_STATUS_FALSE;
@@ -818,7 +817,11 @@
 	switch_mutex_lock(schannel->mutex);
 	if (schannel->state != SPEECH_CHANNEL_CLOSED) {
 		mrcp_application_channel_remove(schannel->unimrcp_session, schannel->unimrcp_channel);
-		switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+		while(schannel->state != SPEECH_CHANNEL_CLOSED) {
+			if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+				break;
+			}
+		}
 		audio_queue_destroy(schannel->audio_queue);
 		if (schannel->state != SPEECH_CHANNEL_CLOSED) {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Failed to destroy channel.  Continuing\n", schannel->name);
@@ -947,7 +950,11 @@
 	}
 
 	/* wait for channel to be ready */
-	switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+	while (schannel->state == SPEECH_CHANNEL_CLOSED) {
+		if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+			break;
+		}
+	}
 	if (schannel->state == SPEECH_CHANNEL_READY) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) channel is ready\n", schannel->name);
 	}
@@ -957,7 +964,11 @@
 		status = SWITCH_STATUS_FALSE;
 	} else if (schannel->state == SPEECH_CHANNEL_ERROR) {
 		/* Wait for session to be cleaned up */
-		switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+		while(schannel->state == SPEECH_CHANNEL_ERROR) {
+			if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+				break;
+			}
+		}
 		if (schannel->state != SPEECH_CHANNEL_CLOSED) {
 			/* major issue... can't retry */
 			status = SWITCH_STATUS_FALSE;
@@ -1033,7 +1044,11 @@
 		goto done;
 	}
 	/* wait for IN PROGRESS */
-	switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+	while (schannel->state == SPEECH_CHANNEL_READY) {
+		if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+			break;
+		}
+	}
 	if (schannel->state != SPEECH_CHANNEL_PROCESSING) {
 		status = SWITCH_STATUS_FALSE;
 		goto done;
@@ -1271,7 +1286,11 @@
 			goto done;
 		}
 		mrcp_application_message_send(schannel->unimrcp_session, schannel->unimrcp_channel, mrcp_message);
-		switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+		while (schannel->state == SPEECH_CHANNEL_PROCESSING) {
+			if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+				break;
+			}
+		}
 
 		if (schannel->state == SPEECH_CHANNEL_PROCESSING) {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Timed out waiting for session to close.  Continuing.\n", schannel->name);
@@ -1562,8 +1581,6 @@
 		status = SWITCH_STATUS_BREAK;
 	}
 
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) rate = %d, native_rate = %d, samplerate = %d\n", schannel->name, sh->rate, sh->native_rate, sh->samplerate);
-
 	/* report negotiated sample rate back to FreeSWITCH */
 	sh->native_rate = schannel->rate;
 
@@ -2072,7 +2089,11 @@
 		goto done;
 	}
 	/* wait for IN PROGRESS */
-	switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+	while (schannel->state == SPEECH_CHANNEL_READY) {
+		if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+			break;
+		}
+	}
 	if (schannel->state != SPEECH_CHANNEL_PROCESSING) {
 		status = SWITCH_STATUS_FALSE;
 		goto done;
@@ -2145,7 +2166,11 @@
 			status = SWITCH_STATUS_FALSE;
 			goto done;
 		}
-		switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+		while (schannel->state == SPEECH_CHANNEL_PROCESSING) {
+			if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+				break;
+			}
+		}
 		if (schannel->state != SPEECH_CHANNEL_READY) {
 			status = SWITCH_STATUS_FALSE;
 			goto done;