From: Steinar H. Gunderson Date: Wed, 21 Sep 2016 18:00:09 +0000 (+0200) Subject: Shut down the ALSA probe retry threads cleanly on exit. X-Git-Tag: 1.4.0~43 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=9932a195e442b67ba95bb1377f29aac27f68eb0e;p=nageru Shut down the ALSA probe retry threads cleanly on exit. --- diff --git a/alsa_pool.cpp b/alsa_pool.cpp index 22a61af..5983446 100644 --- a/alsa_pool.cpp +++ b/alsa_pool.cpp @@ -29,6 +29,10 @@ ALSAPool::~ALSAPool() } should_quit = true; inotify_thread.join(); + + while (retry_threads_running > 0) { + this_thread::sleep_for(std::chrono::milliseconds(100)); + } } std::vector ALSAPool::get_devices() @@ -104,6 +108,7 @@ void ALSAPool::probe_device_with_retry(unsigned card_index, unsigned dev_index) // then start it ourselves. fprintf(stderr, "Trying %s again in one second...\n", address); add_device_tries_left[address] = num_retries; + ++retry_threads_running; thread(&ALSAPool::probe_device_retry_thread_func, this, card_index, dev_index).detach(); } @@ -117,11 +122,12 @@ void ALSAPool::probe_device_retry_thread_func(unsigned card_index, unsigned dev_ // See if there are any retries left. lock_guard lock(add_device_mutex); - if (!add_device_tries_left.count(address) || + if (should_quit || + !add_device_tries_left.count(address) || add_device_tries_left[address] == 0) { add_device_tries_left.erase(address); fprintf(stderr, "Giving up probe of %s.\n", address); - return; + break; } // Seemingly there were. Give it a try (we still hold the mutex). @@ -129,11 +135,11 @@ void ALSAPool::probe_device_retry_thread_func(unsigned card_index, unsigned dev_ if (result == ProbeResult::SUCCESS) { add_device_tries_left.erase(address); fprintf(stderr, "Probe of %s succeeded.\n", address); - return; + break; } else if (result == ProbeResult::FAILURE || --add_device_tries_left[address] == 0) { add_device_tries_left.erase(address); fprintf(stderr, "Giving up probe of %s.\n", address); - return; + break; } // Failed again. @@ -141,6 +147,8 @@ void ALSAPool::probe_device_retry_thread_func(unsigned card_index, unsigned dev_ fprintf(stderr, "Trying %s again in one second (%d tries left)...\n", address, add_device_tries_left[address]); } + + --retry_threads_running; } ALSAPool::ProbeResult ALSAPool::probe_device_once(unsigned card_index, unsigned dev_index) diff --git a/alsa_pool.h b/alsa_pool.h index b5d4cd5..c9cd61a 100644 --- a/alsa_pool.h +++ b/alsa_pool.h @@ -149,8 +149,8 @@ private: const std::string &address); std::atomic should_quit{false}; - std::thread inotify_thread; + std::atomic retry_threads_running{0}; friend class ALSAInput; };