| 1908 | } |
| 1909 | |
| 1910 | static void runtime_reap_completed_workers(cbm_daemon_runtime_service_t *service) { |
| 1911 | for (size_t i = 0; i < service->worker_capacity; i++) { |
| 1912 | cbm_daemon_runtime_worker_t *worker = &service->workers[i]; |
| 1913 | cbm_mutex_lock(&service->mutex); |
| 1914 | bool reap = worker->in_use && worker->thread_started && !worker->joining && |
| 1915 | atomic_load_explicit(&worker->done, memory_order_acquire); |
| 1916 | if (reap) { |
| 1917 | worker->joining = true; |
| 1918 | } |
| 1919 | cbm_mutex_unlock(&service->mutex); |
| 1920 | if (!reap) { |
| 1921 | continue; |
| 1922 | } |
| 1923 | int joined = cbm_thread_join(&worker->thread); |
| 1924 | cbm_mutex_lock(&service->mutex); |
| 1925 | if (joined == 0) { |
| 1926 | runtime_worker_reset_after_join(worker); |
| 1927 | } else { |
| 1928 | worker->joining = false; |
| 1929 | } |
| 1930 | cbm_mutex_unlock(&service->mutex); |
| 1931 | } |
| 1932 | } |
| 1933 | |
| 1934 | static cbm_daemon_runtime_worker_t *runtime_find_free_worker_locked( |
| 1935 | cbm_daemon_runtime_service_t *service) { |
no test coverage detected