/*===========================================================================* * sef_cb_lu_prepare * *===========================================================================*/ static int sef_cb_lu_prepare(int state) { /* This function is called to decide whether we can enter the given live * update state, and to prepare for such an update. If we are requested to * update to a request-free or protocol-free state, make sure there is no work * pending or being processed, and shut down all worker threads. */ switch (state) { case SEF_LU_STATE_REQUEST_FREE: case SEF_LU_STATE_PROTOCOL_FREE: if (!worker_idle()) { printf("VFS: worker threads not idle, blocking update\n"); break; } worker_cleanup(); return OK; } return ENOTREADY; }
/*! * \brief start point for worker threads * * Worker threads start in the active state but may * immediately go idle if there is no work to be * done * * \param arg The worker thread * \retval NULL */ static void *worker_start(void *arg) { struct worker_thread *worker = arg; if (worker->options.thread_start) { worker->options.thread_start(); } ast_mutex_lock(&worker->lock); while (worker_idle(worker)) { ast_mutex_unlock(&worker->lock); worker_active(worker); ast_mutex_lock(&worker->lock); if (worker->state != ALIVE) { break; } threadpool_active_thread_idle(worker->pool, worker); } ast_mutex_unlock(&worker->lock); /* Reaching this portion means the thread is * on death's door. It may have been killed while * it was idle, in which case it can just die * peacefully. If it's a zombie, though, then * it needs to let the pool know so * that the thread can be removed from the * list of zombie threads. */ if (worker->state == ZOMBIE) { threadpool_zombie_thread_dead(worker->pool, worker); } if (worker->options.thread_end) { worker->options.thread_end(); } return NULL; }