forked from mirrors/kore
Get rid of WORKER_LOCK_TIMEOUT.
Instead let the workers send a message on the msg channel to each other when they have given up the accept lock and it is now available to be grabbed.
This commit is contained in:
parent
8b0279879a
commit
370041656e
@ -498,6 +498,7 @@ struct kore_timer {
|
||||
#define KORE_MSG_CERTIFICATE 7
|
||||
#define KORE_MSG_CERTIFICATE_REQ 8
|
||||
#define KORE_MSG_CRL 9
|
||||
#define KORE_MSG_ACCEPT_AVAILABLE 10
|
||||
|
||||
/* Predefined message targets. */
|
||||
#define KORE_MSG_PARENT 1000
|
||||
|
43
src/worker.c
43
src/worker.c
@ -53,8 +53,6 @@
|
||||
#define WAIT_ANY (-1)
|
||||
#endif
|
||||
|
||||
#define WORKER_LOCK_TIMEOUT 100
|
||||
|
||||
#if !defined(KORE_NO_TLS)
|
||||
#define WORKER_SOLO_COUNT 2
|
||||
#else
|
||||
@ -74,7 +72,8 @@ static int worker_trylock(void);
|
||||
static void worker_unlock(void);
|
||||
|
||||
static inline int worker_acceptlock_obtain(void);
|
||||
static inline int worker_acceptlock_release(void);
|
||||
static inline void worker_acceptlock_release(void);
|
||||
static void worker_accept_avail(struct kore_msg *, const void *);
|
||||
|
||||
#if !defined(KORE_NO_TLS)
|
||||
static void worker_entropy_recv(struct kore_msg *, const void *);
|
||||
@ -83,7 +82,7 @@ static int worker_keymgr_response_verify(struct kore_msg *, const void *,
|
||||
struct kore_domain **);
|
||||
#endif
|
||||
|
||||
static u_int64_t next_lock;
|
||||
static int accept_avail;
|
||||
static struct kore_worker *kore_workers;
|
||||
static int worker_no_lock;
|
||||
static int shm_accept_key;
|
||||
@ -353,8 +352,8 @@ kore_worker_entry(struct kore_worker *kw)
|
||||
|
||||
quit = 0;
|
||||
had_lock = 0;
|
||||
next_lock = 0;
|
||||
next_prune = 0;
|
||||
accept_avail = 1;
|
||||
worker_active_connections = 0;
|
||||
|
||||
#if defined(KORE_USE_PGSQL)
|
||||
@ -376,6 +375,8 @@ kore_worker_entry(struct kore_worker *kw)
|
||||
}
|
||||
#endif
|
||||
|
||||
kore_msg_register(KORE_MSG_ACCEPT_AVAILABLE, worker_accept_avail);
|
||||
|
||||
if (nlisteners == 0)
|
||||
worker_no_lock = 1;
|
||||
|
||||
@ -405,14 +406,13 @@ kore_worker_entry(struct kore_worker *kw)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!worker->has_lock && next_lock <= now) {
|
||||
if (!worker->has_lock && accept_avail) {
|
||||
accept_avail = 0;
|
||||
if (worker_acceptlock_obtain()) {
|
||||
if (had_lock == 0) {
|
||||
kore_platform_enable_accept();
|
||||
had_lock = 1;
|
||||
}
|
||||
} else {
|
||||
next_lock = now + WORKER_LOCK_TIMEOUT / 2;
|
||||
}
|
||||
}
|
||||
|
||||
@ -420,10 +420,8 @@ kore_worker_entry(struct kore_worker *kw)
|
||||
kore_platform_event_wait(netwait);
|
||||
now = kore_time_ms();
|
||||
|
||||
if (worker->has_lock) {
|
||||
if (worker_acceptlock_release())
|
||||
next_lock = now + WORKER_LOCK_TIMEOUT;
|
||||
}
|
||||
if (worker->has_lock)
|
||||
worker_acceptlock_release();
|
||||
|
||||
if (!worker->has_lock) {
|
||||
if (had_lock == 1) {
|
||||
@ -600,25 +598,26 @@ kore_worker_make_busy(void)
|
||||
if (worker->has_lock) {
|
||||
worker_unlock();
|
||||
worker->has_lock = 0;
|
||||
next_lock = kore_time_ms() + WORKER_LOCK_TIMEOUT;
|
||||
kore_msg_send(KORE_MSG_WORKER_ALL,
|
||||
KORE_MSG_ACCEPT_AVAILABLE, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int
|
||||
static inline void
|
||||
worker_acceptlock_release(void)
|
||||
{
|
||||
if (worker_count == WORKER_SOLO_COUNT || worker_no_lock == 1)
|
||||
return (0);
|
||||
return;
|
||||
|
||||
if (worker->has_lock != 1)
|
||||
return (0);
|
||||
return;
|
||||
|
||||
if (worker_active_connections < worker_max_connections) {
|
||||
#if !defined(KORE_NO_HTTP)
|
||||
if (http_request_count < http_request_limit)
|
||||
return (0);
|
||||
return;
|
||||
#else
|
||||
return (0);
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -629,7 +628,7 @@ worker_acceptlock_release(void)
|
||||
worker_unlock();
|
||||
worker->has_lock = 0;
|
||||
|
||||
return (1);
|
||||
kore_msg_send(KORE_MSG_WORKER_ALL, KORE_MSG_ACCEPT_AVAILABLE, NULL, 0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
@ -684,6 +683,12 @@ worker_unlock(void)
|
||||
kore_log(LOG_NOTICE, "worker_unlock(): wasnt locked");
|
||||
}
|
||||
|
||||
static void
|
||||
worker_accept_avail(struct kore_msg *msg, const void *data)
|
||||
{
|
||||
accept_avail = 1;
|
||||
}
|
||||
|
||||
#if !defined(KORE_NO_TLS)
|
||||
static void
|
||||
worker_entropy_recv(struct kore_msg *msg, const void *data)
|
||||
|
Loading…
Reference in New Issue
Block a user