void stop_assoc_maintenance_thread() { cb_mutex_enter(&cache_lock); do_run_maintenance_thread = 0; cb_cond_signal(&maintenance_cond); cb_mutex_exit(&cache_lock); /* Wait for the maintenance thread to stop */ cb_join_thread(maintenance_tid); }
int work_collect_count(work_collect *c, int count) { int rv = 0; cb_mutex_enter(&c->collect_lock); c->count = count; if (c->count <= 0) { cb_cond_signal(&c->collect_cond); } cb_mutex_exit(&c->collect_lock); return rv; }
int work_collect_one(work_collect *c) { int rv = 0; cb_mutex_enter(&c->collect_lock); cb_assert(c->count >= 1); c->count--; if (c->count <= 0) { cb_cond_signal(&c->collect_cond); } cb_mutex_exit(&c->collect_lock); return rv; }
/* * Adds an item to a connection queue. */ static void cq_push(CQ *cq, CQ_ITEM *item) { item->next = NULL; cb_mutex_enter(&cq->lock); if (NULL == cq->tail) cq->head = item; else cq->tail->next = item; cq->tail = item; cb_cond_signal(&cq->cond); cb_mutex_exit(&cq->lock); }
/* * Worker thread: main event loop */ static void worker_libevent(void *arg) { LIBEVENT_THREAD *me = arg; /* Any per-thread setup can happen here; thread_init() will block until * all threads have finished initializing. */ cb_mutex_enter(&init_lock); init_count++; cb_cond_signal(&init_cond); cb_mutex_exit(&init_lock); event_base_loop(me->base, 0); }
/* grows the hashtable to the next power of 2. */ static void assoc_expand(void) { old_hashtable = primary_hashtable; primary_hashtable = calloc(hashsize(hashpower + 1), sizeof(void *)); if (primary_hashtable) { if (settings.verbose > 1) moxi_log_write("Hash table expansion starting\n"); hashpower++; expanding = true; expand_bucket = 0; cb_cond_signal(&maintenance_cond); } else { primary_hashtable = old_hashtable; /* Bad news, but we can keep running. */ } }