int pool_size;
struct pf_worker_data *pool;
+
+ int allowed_clients;
};
int prefork_pool_destructor(struct prefork_pool *pfp)
talloc_set_destructor(pfp, prefork_pool_destructor);
for (i = 0; i < min_children; i++) {
+
+ pfp->pool[i].allowed_clients = 1;
+ pfp->pool[i].started = now;
+
pid = sys_fork();
switch (pid) {
case -1:
default: /* THE PARENT */
pfp->pool[i].pid = pid;
- pfp->pool[i].started = now;
break;
}
}
continue;
}
+ pfp->pool[i].allowed_clients = 1;
+ pfp->pool[i].started = now;
+
pid = sys_fork();
switch (pid) {
case -1:
default: /* THE PARENT */
pfp->pool[i].pid = pid;
- pfp->pool[i].started = now;
j++;
break;
}
return false;
}
+void prefork_increase_allowed_clients(struct prefork_pool *pfp, int max)
+{
+ int i;
+
+ for (i = 0; i < pfp->pool_size; i++) {
+ if (pfp->pool[i].status == PF_WORKER_NONE) {
+ continue;
+ }
+
+ if (pfp->pool[i].allowed_clients < max) {
+ pfp->pool[i].allowed_clients++;
+ }
+ }
+}
+
+void prefork_reset_allowed_clients(struct prefork_pool *pfp)
+{
+ int i;
+
+ for (i = 0; i < pfp->pool_size; i++) {
+ pfp->pool[i].allowed_clients = 1;
+ }
+}
+
/* ==== Functions used by children ==== */
static SIG_ATOMIC_T pf_alarm;
struct pf_worker_data {
pid_t pid;
enum pf_worker_status status;
- enum pf_server_cmds cmds;
time_t started;
time_t last_used;
int num_clients;
+
+ enum pf_server_cmds cmds;
+ int allowed_clients;
};
typedef int (prefork_main_fn_t)(struct tevent_context *ev,
int num_children, time_t age_limit);
int prefork_count_active_children(struct prefork_pool *pfp, int *total);
bool prefork_mark_pid_dead(struct prefork_pool *pfp, pid_t pid);
+void prefork_increase_allowed_clients(struct prefork_pool *pfp, int max);
+void prefork_reset_allowed_clients(struct prefork_pool *pfp);
/* ==== Functions used by children ==== */