int pool_update_state(pool_proc* dpool, pool_mutex* dpool_mutex) { int free_n = 0; pthread_mutex_lock(&dpool_mutex->mutex); for (int i = 0; i < dpool_mutex->processing_n; i++) { if (dpool[i].status == 0) { free_n++; } else if (dpool[i].status == 1) { if (kill(dpool[i].pid, 0) != 0) { dpool[i].status=0; free_n++; } } } if (free_n < N && dpool_mutex->processing_n+M < BACKLOG) pool_set(dpool, dpool_mutex); else if (free_n > K) pool_fit(M, dpool, dpool_mutex); pthread_mutex_unlock(&dpool_mutex->mutex); return 0; }
static cos_inline struct AutoRelease* pool_get(void) { struct AutoRelease *pool = pthread_getspecific(_pool_key); if (pool) return pool; pool_set(&_pool0); return &_pool0; }