int API_FUNC qthread_disable_worker(const qthread_worker_id_t w) { /*{{{*/ assert(qthread_library_initialized); unsigned int shep = w % qlib->nshepherds; unsigned int worker = w / qlib->nshepherds; qassert_ret((shep < qlib->nshepherds), QTHREAD_BADARGS); qassert_ret((worker < qlib->nworkerspershep), QTHREAD_BADARGS); if ((worker == 0) & (shep == 0)) { /* currently, the "real mccoy" original thread cannot be migrated * (because I don't know what issues that could cause on all * architectures). For similar reasons, therefore, the original * shepherd cannot be disabled. One of the nice aspects of this is that * therefore it is impossible to disable ALL shepherds. * * ... it's entirely possible that I'm being overly cautious. This is a * policy based on gut feeling rather than specific issues. */ return QTHREAD_NOT_ALLOWED; } qthread_debug(SHEPHERD_CALLS, "began on worker(%i-%i)\n", shep, worker); (void)QT_CAS(qlib->shepherds[shep].workers[worker].active, 1, 0); qlib->nworkers_active--; // decrement active count if (worker == 0) { qthread_disable_shepherd(shep); } return QTHREAD_SUCCESS; } /*}}}*/
GLT_func_prefix void glt_thread_disable(GLT_bool *res, GLT_thread id) { *res = qthread_disable_shepherd(id); }