static void *log_commit_thread (void *arg) { INFO0 ("started"); while (1) { int ret = util_timed_wait_for_fd (logger_fd[0], 5000); if (ret == 0) continue; if (ret > 0) { char cm[80]; ret = pipe_read (logger_fd[0], cm, sizeof cm); if (ret > 0) { // fprintf (stderr, "logger woken with %d\n", ret); log_commit_entries (); continue; } } if (ret < 0 && sock_recoverable (sock_error())) continue; int err = sock_error(); sock_close (logger_fd[0]); sock_close (logger_fd[1]); if (worker_count) { worker_control_create (logger_fd); ERROR1 ("logger received code %d", err); continue; } // fprintf (stderr, "logger closed with zero workers\n"); break; } return NULL; }
static void worker_start (void) { worker_t *handler = calloc (1, sizeof(worker_t)); worker_control_create (&handler->wakeup_fd[0]); handler->pending_clients_tail = &handler->pending_clients; thread_spin_create (&handler->lock); handler->last_p = &handler->clients; thread_rwlock_wlock (&workers_lock); if (worker_incoming == NULL) { worker_incoming = handler; handler->thread = thread_create ("worker", worker, handler, THREAD_ATTACHED); thread_rwlock_unlock (&workers_lock); INFO0 ("starting incoming worker thread"); worker_start(); // single level recursion, just get a special worker thread set up return; } handler->next = workers; workers = handler; worker_count++; worker_least_used = worker_balance_to_check = workers; thread_rwlock_unlock (&workers_lock); handler->thread = thread_create ("worker", worker, handler, THREAD_ATTACHED); }
static void worker_start (void) { worker_t *handler = calloc (1, sizeof(worker_t)); worker_control_create (handler); handler->pending_clients_tail = &handler->pending_clients; thread_spin_create (&handler->lock); thread_rwlock_wlock (&workers_lock); handler->last_p = &handler->clients; handler->next = workers; workers = handler; worker_count++; worker_least_used = worker_balance_to_check = workers; handler->thread = thread_create ("worker", worker, handler, THREAD_ATTACHED); thread_rwlock_unlock (&workers_lock); }
void worker_logger_init (void) { worker_control_create (logger_fd); log_set_commit_callback (logger_commits); }