| 1936 | } |
| 1937 | |
| 1938 | static void runtime_reap_completed_workers(cbm_daemon_runtime_service_t *service) { |
| 1939 | for (size_t i = 0; i < service->worker_capacity; i++) { |
| 1940 | cbm_daemon_runtime_worker_t *worker = &service->workers[i]; |
| 1941 | cbm_mutex_lock(&service->mutex); |
| 1942 | bool reap = worker->in_use && worker->thread_started && !worker->joining && |
| 1943 | atomic_load_explicit(&worker->done, memory_order_acquire); |
| 1944 | if (reap) { |
| 1945 | worker->joining = true; |
| 1946 | } |
| 1947 | cbm_mutex_unlock(&service->mutex); |
| 1948 | if (!reap) { |
| 1949 | continue; |
| 1950 | } |
| 1951 | int joined = cbm_thread_join(&worker->thread); |
| 1952 | cbm_mutex_lock(&service->mutex); |
| 1953 | if (joined == 0) { |
| 1954 | runtime_worker_reset_after_join(worker); |
| 1955 | } else { |
| 1956 | worker->joining = false; |
| 1957 | } |
| 1958 | cbm_mutex_unlock(&service->mutex); |
| 1959 | } |
| 1960 | } |
| 1961 | |
| 1962 | static cbm_daemon_runtime_worker_t *runtime_find_free_worker_locked( |
| 1963 | cbm_daemon_runtime_service_t *service) { |
no test coverage detected