| 1967 | } |
| 1968 | |
| 1969 | static void runtime_reap_completed_workers(cbm_daemon_runtime_service_t *service) { |
| 1970 | for (size_t i = 0; i < service->worker_capacity; i++) { |
| 1971 | cbm_daemon_runtime_worker_t *worker = &service->workers[i]; |
| 1972 | cbm_mutex_lock(&service->mutex); |
| 1973 | bool reap = worker->in_use && worker->thread_started && !worker->joining && |
| 1974 | atomic_load_explicit(&worker->done, memory_order_acquire); |
| 1975 | if (reap) { |
| 1976 | worker->joining = true; |
| 1977 | } |
| 1978 | cbm_mutex_unlock(&service->mutex); |
| 1979 | if (!reap) { |
| 1980 | continue; |
| 1981 | } |
| 1982 | int joined = cbm_thread_join(&worker->thread); |
| 1983 | cbm_mutex_lock(&service->mutex); |
| 1984 | if (joined == 0) { |
| 1985 | runtime_worker_reset_after_join(worker); |
| 1986 | } else { |
| 1987 | worker->joining = false; |
| 1988 | } |
| 1989 | cbm_mutex_unlock(&service->mutex); |
| 1990 | } |
| 1991 | } |
| 1992 | |
| 1993 | static cbm_daemon_runtime_worker_t *runtime_find_free_worker_locked( |
| 1994 | cbm_daemon_runtime_service_t *service) { |
no test coverage detected