Fix hanging exit on control-C.

(cherry picked from commit e6f8283946cc3150bcba2d8b3cbab11f5d509308)
This commit is contained in:
Oliver Jowett 2015-01-13 20:12:59 +00:00
parent 2627933963
commit 165f98a567

View file

@ -271,7 +271,6 @@ int modesInitRTLSDR(void) {
// A Mutex is used to avoid races with the decoding thread. // A Mutex is used to avoid races with the decoding thread.
// //
void rtlsdrCallback(unsigned char *buf, uint32_t len, void *ctx) { void rtlsdrCallback(unsigned char *buf, uint32_t len, void *ctx) {
MODES_NOTUSED(ctx); MODES_NOTUSED(ctx);
// Lock the data buffer variables before accessing them // Lock the data buffer variables before accessing them
@ -1013,6 +1012,8 @@ int main(int argc, char **argv) {
pthread_mutex_lock(&Modes.data_mutex); pthread_mutex_lock(&Modes.data_mutex);
} }
pthread_mutex_unlock(&Modes.data_mutex);
// If --stats were given, print statistics // If --stats were given, print statistics
if (Modes.stats) { if (Modes.stats) {
display_stats(); display_stats();
@ -1020,10 +1021,16 @@ int main(int argc, char **argv) {
if (Modes.filename == NULL) { if (Modes.filename == NULL) {
rtlsdr_cancel_async(Modes.dev); // Cancel rtlsdr_read_async will cause data input thread to terminate cleanly rtlsdr_cancel_async(Modes.dev); // Cancel rtlsdr_read_async will cause data input thread to terminate cleanly
rtlsdr_close(Modes.dev);
} }
pthread_join(Modes.reader_thread,NULL); // Wait on reader thread exit pthread_join(Modes.reader_thread,NULL); // Wait on reader thread exit
// Nothing is touching the rtlsdr device now.
if (Modes.filename == NULL) {
rtlsdr_close(Modes.dev);
}
pthread_cond_destroy(&Modes.data_cond); // Thread cleanup - only after the reader thread is dead! pthread_cond_destroy(&Modes.data_cond); // Thread cleanup - only after the reader thread is dead!
pthread_mutex_destroy(&Modes.data_mutex); pthread_mutex_destroy(&Modes.data_mutex);