Allow the user defined callback to run on workers as well.

This commit is contained in:
Joris Vink 2013-09-03 08:40:00 +02:00
parent 95c8b8e126
commit ee3fd3c039
6 changed files with 58 additions and 8 deletions

View File

@ -233,6 +233,7 @@ extern char *kore_cb_name;
extern char *kore_ssl_cipher_list;
extern DH *ssl_dhparam;
extern int ssl_no_compression;
extern int kore_cb_worker;
extern u_int8_t nlisteners;
extern u_int64_t spdy_idle_time;

View File

@ -24,11 +24,14 @@ workers 4
# The onload function is called everytime the module is loaded or reloaded.
#onload myinit
# You can define a callback Kore calls from its parent process everytime
# the kore_cb_interval timer (in milliseconds) is reached.
# You can define a callback Kore calls from its parent process or
# workers everytime # the kore_cb_interval timer (in milliseconds) is reached.
#
# NOTE: Remember that the parent process runs as root and is not chroot().
# NOTE: If you want the cb to run on a worker, be sure to set kore_cb_worker.
#kore_cb my_callback
#kore_cb_interval 1000
#kore_cb_worker 3
# Specifies what module to be loaded.
load modules/example/example.module

View File

@ -25,6 +25,7 @@ int serve_intro(struct http_request *);
int serve_b64test(struct http_request *);
int serve_spdyreset(struct http_request *);
void my_callback(void);
void test_base64(u_int8_t *, u_int32_t, struct kore_buf *);
char *b64tests[] = {
@ -148,3 +149,12 @@ test_base64(u_int8_t *src, u_int32_t slen, struct kore_buf *res)
kore_buf_appendf(res, "\n");
}
void
my_callback(void)
{
if (worker != NULL)
kore_log(LOG_NOTICE, "running on worker %d", worker->id);
else
kore_log(LOG_NOTICE, "running from parent");
}

View File

@ -40,6 +40,7 @@ static int configure_ssl_no_compression(char **);
static int configure_spdy_idle_time(char **);
static int configure_kore_cb(char **);
static int configure_kore_cb_interval(char **);
static int configure_kore_cb_worker(char **);
static void domain_sslstart(void);
static struct {
@ -65,6 +66,7 @@ static struct {
{ "certfile", configure_certfile },
{ "certkey", configure_certkey },
{ "kore_cb", configure_kore_cb },
{ "kore_cb_worker", configure_kore_cb_worker },
{ "kore_cb_interval", configure_kore_cb_interval },
{ NULL, NULL },
};
@ -476,6 +478,28 @@ configure_kore_cb_interval(char **argv)
return (KORE_RESULT_OK);
}
static int
configure_kore_cb_worker(char **argv)
{
int err;
if (argv[1] == NULL)
return (KORE_RESULT_ERROR);
if (kore_cb_worker != -1) {
kore_debug("kore_cb_worker already set");
return (KORE_RESULT_ERROR);
}
kore_cb_worker = kore_strtonum(argv[1], 10, 0, worker_count, &err);
if (err != KORE_RESULT_OK) {
kore_debug("invalid value for kore_cb_worker");
return (KORE_RESULT_ERROR);
}
return (KORE_RESULT_OK);
}
static void
domain_sslstart(void)
{

View File

@ -29,11 +29,12 @@ struct passwd *pw = NULL;
pid_t kore_pid = -1;
u_int16_t cpu_count = 1;
int kore_debug = 0;
void (*kore_cb)(void);
u_int8_t worker_count = 0;
char *runas_user = NULL;
char *chroot_path = NULL;
int kore_cb_worker = -1;
u_int64_t kore_cb_interval = 0;
void (*kore_cb)(void) = NULL;
char *kore_pidfile = KORE_PIDFILE_DEFAULT;
char *kore_ssl_cipher_list = KORE_DEFAULT_CIPHER_LIST;
@ -254,10 +255,12 @@ kore_server_start(void)
if (!kore_accesslog_wait())
break;
now = kore_time_ms();
if ((now - last_cb_run) >= kore_cb_interval) {
last_cb_run = now;
kore_cb();
if (kore_cb != NULL && kore_cb_worker == -1) {
now = kore_time_ms();
if ((now - last_cb_run) >= kore_cb_interval) {
last_cb_run = now;
kore_cb();
}
}
kore_worker_wait(0);

View File

@ -169,7 +169,7 @@ kore_worker_entry(struct kore_worker *kw)
int quit;
char buf[16];
struct connection *c, *cnext;
u_int64_t now, idle_check;
u_int64_t now, idle_check, last_cb_run;
worker = kw;
@ -208,6 +208,7 @@ kore_worker_entry(struct kore_worker *kw)
now = idle_check = 0;
kore_platform_event_init();
kore_accesslog_worker_init();
last_cb_run = kore_time_ms();
worker->accept_treshold = worker_max_connections / 10;
kore_log(LOG_NOTICE, "worker %d started (cpu#%d)", kw->id, kw->cpu);
@ -251,6 +252,14 @@ kore_worker_entry(struct kore_worker *kw)
}
}
if (kore_cb != NULL && kore_cb_worker != -1 &&
kore_cb_worker == worker->id) {
if ((now - last_cb_run) >= kore_cb_interval) {
last_cb_run = now;
kore_cb();
}
}
for (c = TAILQ_FIRST(&disconnected); c != NULL; c = cnext) {
cnext = TAILQ_NEXT(c, list);
TAILQ_REMOVE(&disconnected, c, list);