diff --git a/src/measurement/measure_queue.c b/src/measurement/measure_queue.c index a6e0f3c..5689bcf 100644 --- a/src/measurement/measure_queue.c +++ b/src/measurement/measure_queue.c @@ -15,6 +15,7 @@ #define MEASURE_QUEUE_PERIOD_MS 100U #define MEASURE_QUEUE_THREAD_STACK_SIZE 2048 #define MEASURE_QUEUE_THREAD_PRIORITY 7 +#define MEASURE_QUEUE_STOP_JOIN_TIMEOUT_MS 3000U /* data_storage flash partition handle, opened once and reused */ static const struct flash_area *queue_area; @@ -305,10 +306,15 @@ int measure_queue_stop(uint32_t *tick_end, uint8_t *session, uint16_t *total_fra queue_recording = false; k_mutex_unlock(&queue_lock); + int join_err = 0; if (was_running) { - // rfe: 응답 시 측정 중인 경우 측정 완료될 때까지 기다림 - (void)k_thread_join(&queue_thread, K_FOREVER); + // Wait for the recording thread, but never block the BLE command path forever. + join_err = k_thread_join(&queue_thread, K_MSEC(MEASURE_QUEUE_STOP_JOIN_TIMEOUT_MS)); + if (join_err) + { + DBG_ERR("[MFE] record thread join timeout err=%d\r\n", join_err); + } } k_mutex_lock(&queue_lock, K_FOREVER); @@ -324,7 +330,7 @@ int measure_queue_stop(uint32_t *tick_end, uint8_t *session, uint16_t *total_fra { *total_frames = queue_total_frames; } - int status = queue_status; + int status = (join_err != 0) ? -ETIMEDOUT : queue_status; uint8_t stop_session = queue_session; uint16_t stop_frames = queue_total_frames; uint16_t num_samples = queue_num_samples; @@ -446,4 +452,4 @@ int measure_queue_read_frame(uint16_t frame_idx, measure_queue_frame_header_t *h } return 0; -} \ No newline at end of file +}