void master_start_service(MASTER_SERV *serv) { /* * Enable connection requests, wakeup timers, and status updates from * child processes. */ master_listen_init(serv); master_avail_listen(serv); master_status_init(serv); master_wakeup_init(serv); }
static void master_unthrottle(MASTER_SERV *serv) { /* * Enable process creation within this class. Disable the "unthrottle" * timer just in case we're being called directly from the cleanup * routine, instead of from the event manager. */ if ((serv->flags & MASTER_FLAG_THROTTLE) != 0) { serv->flags &= ~MASTER_FLAG_THROTTLE; event_cancel_timer(master_unthrottle_wrapper, (void *) serv); if (msg_verbose) msg_info("throttle released for command %s", serv->path); master_avail_listen(serv); } }
static void master_throttle(MASTER_SERV *serv) { /* * Perhaps the command to be run is defective, perhaps some configuration * is wrong, or perhaps the system is out of resources. Disable further * process creation attempts for a while. */ if ((serv->flags & MASTER_FLAG_THROTTLE) == 0) { serv->flags |= MASTER_FLAG_THROTTLE; event_request_timer(master_unthrottle_wrapper, (void *) serv, serv->throttle_delay); if (msg_verbose) msg_info("throttling command %s", serv->path); master_avail_listen(serv); } }
static void master_delete_child(MASTER_PROC *proc) { MASTER_SERV *serv; /* * Undo the things that master_spawn did. Stop the process if it still * exists, and remove it from the lookup tables. Update the number of * available processes. */ serv = proc->serv; serv->total_proc--; if (proc->avail == MASTER_STAT_AVAIL) master_avail_less(serv, proc); else master_avail_listen(serv); binhash_delete(master_child_table, (void *) &proc->pid, sizeof(proc->pid), (void (*) (void *)) 0); myfree((void *) proc); }
void master_restart_service(MASTER_SERV *serv, int conf_reload) { /* * Undo some of the things that master_start_service() did. */ master_wakeup_cleanup(serv); master_status_cleanup(serv); /* * Now undo the undone. */ master_status_init(serv); master_wakeup_init(serv); /* * Respond to configuration change. */ if (conf_reload) master_avail_listen(serv); }
void master_avail_less(MASTER_SERV *serv, MASTER_PROC *proc) { const char *myname = "master_avail_less"; /* * Caution: several other master_XXX modules call master_avail_listen(), * master_avail_more() or master_avail_less(). To avoid mutual dependency * problems, the code below invokes no code in other master_XXX modules, * and modifies no data that is maintained by other master_XXX modules. * * This child is no longer available for servicing connection requests. * When no child processes are available, start monitoring the service's * listen socket for new connection requests. */ if (msg_verbose) msg_info("%s: pid %d (%s)", myname, proc->pid, proc->serv->name); if (proc->avail != MASTER_STAT_AVAIL) msg_panic("%s: process not available", myname); serv->avail_proc--; proc->avail = MASTER_STAT_TAKEN; master_avail_listen(serv); }
void master_avail_more(MASTER_SERV *serv, MASTER_PROC *proc) { const char *myname = "master_avail_more"; /* * Caution: several other master_XXX modules call master_avail_listen(), * master_avail_more() or master_avail_less(). To avoid mutual dependency * problems, the code below invokes no code in other master_XXX modules, * and modifies no data that is maintained by other master_XXX modules. * * This child process has become available for servicing connection * requests, so we can stop monitoring the service's listen socket. The * child will do it for us. */ if (msg_verbose) msg_info("%s: pid %d (%s)", myname, proc->pid, proc->serv->name); if (proc->avail == MASTER_STAT_AVAIL) msg_panic("%s: process already available", myname); serv->avail_proc++; proc->avail = MASTER_STAT_AVAIL; master_avail_listen(serv); }