diff --git a/srslte/lib/rf/rf_uhd_imp.c b/srslte/lib/rf/rf_uhd_imp.c index 8b3cfbc13..5b109710f 100644 --- a/srslte/lib/rf/rf_uhd_imp.c +++ b/srslte/lib/rf/rf_uhd_imp.c @@ -56,6 +56,7 @@ typedef struct { srslte_rf_error_handler_t uhd_error_handler; + bool async_thread_running; pthread_t async_thread; } rf_uhd_handler_t; @@ -97,7 +98,7 @@ static void* async_thread(void *h) { rf_uhd_handler_t *handler = (rf_uhd_handler_t*) h; uhd_async_metadata_handle md; uhd_async_metadata_make(&md); - while(1) { + while(handler->async_thread_running) { bool valid; uhd_error err = uhd_tx_streamer_recv_async_msg(handler->tx_stream, &md, 10.0, &valid); if (err == UHD_ERROR_NONE) { @@ -423,6 +424,7 @@ int rf_uhd_open_multi(char *args, void **h, uint32_t nof_rx_antennas) // Start low priority thread to receive async commands + handler->async_thread_running = true; if (pthread_create(&handler->async_thread, NULL, async_thread, handler)) { perror("pthread_create"); return -1; @@ -450,6 +452,8 @@ int rf_uhd_close(void *h) if (handler->has_rssi) { uhd_sensor_value_free(&handler->rssi_value); } + handler->async_thread_running = false; + pthread_join(handler->async_thread, NULL); uhd_usrp_free(&handler->usrp); /** Something else to close the USRP?? */