Commit 005d2142 authored by Greg Williams's avatar Greg Williams
Browse files

Modified threadpool and sender threads to have longer starting polling...

Modified threadpool and sender threads to have longer starting polling timeouts and backoff to full sleep  when idle.
parent 3e882ae4
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -36,6 +36,9 @@
#include "yacht.h"
#include "sender_internal.h"

#define MIN_DELAY 100
#define INFINITE_DELAY -1

/* Offset for s->fds[0], which is the command pipe. */
#define CMD_FD (1)

@@ -324,8 +327,7 @@ void *sender_mainloop(void *arg) {
    sender *self = (sender *)arg;
    assert(self);
    struct bus *b = self->bus;
    
    int delay = 1;
    int delay = MIN_DELAY;
    
    struct timeval tv;
    gettimeofday(&tv, NULL);
@@ -379,10 +381,10 @@ void *sender_mainloop(void *arg) {
        }
        
        if (work) {
            delay = 1;
        } else {
            delay = MIN_DELAY;
        } else if (delay != INFINITE_DELAY) {
            delay <<= 1;
            if (delay > MAX_TIMEOUT) { delay = MAX_TIMEOUT; }
            if (delay > MAX_TIMEOUT) { delay = INFINITE_DELAY; }
        }
    }
    
+21 −8
Original line number Diff line number Diff line
@@ -28,10 +28,14 @@

#include "threadpool_internals.h"

#define DEFAULT_MAX_DELAY 1000   /* msec */
#define MIN_DELAY 2
#define DEFAULT_MAX_DELAY 10000   /* msec */
#define INFINITE_DELAY -1
#define DEFAULT_TASK_RINGBUF_SIZE2 8
#define DEFAULT_MAX_THREADS 8

#define DORMANT_WHEN_IDLE false

static void set_defaults(struct threadpool_config *cfg) {
    if (cfg->task_ringbuf_size2 == 0) {
        cfg->task_ringbuf_size2 = DEFAULT_TASK_RINGBUF_SIZE2;
@@ -289,23 +293,30 @@ static void *thread_task(void *arg) {
    size_t mask = t->task_ringbuf_mask;
    struct pollfd pfd[1] = { { .fd=ti->child_fd, .events=POLLIN }, };
    uint8_t read_buf[NOTIFY_MSG_LEN];
    size_t min_delay = 100;
    size_t delay = min_delay;
#if DORMANT_WHEN_IDLE
    const size_t delay = 1000;
#else
    int delay = MIN_DELAY;
#endif

    while (ti->status < STATUS_SHUTDOWN) {
        if (t->task_request_head == t->task_commit_head) {

#if !DORMANT_WHEN_IDLE
            if (ti->status == STATUS_AWAKE) {
                if (delay > 1) { ti->status = STATUS_ASLEEP; }
                if (delay == INFINITE_DELAY || delay > 1) { ti->status = STATUS_ASLEEP; }
            } else {
                if (delay == 0) {
                    delay = min_delay;
                    delay = MIN_DELAY;
                } else {
                    delay <<= 1;
                }
                if (delay > t->max_delay) {
                    delay = t->max_delay;
                if ((size_t)delay > t->max_delay) {
                    // delay = t->max_delay;
                    delay = INFINITE_DELAY;
                }
            }
#endif

            int res = poll(pfd, 1, delay);
            if (res == 1) {
@@ -316,7 +327,9 @@ static void *thread_task(void *arg) {
                    break;
                } else if (pfd[0].revents & POLLIN) {
                    if (ti->status == STATUS_ASLEEP) { ti->status = STATUS_AWAKE; }
                    delay = min_delay;
#if !DORMANT_WHEN_IDLE
                    delay = MIN_DELAY;
#endif
                    //SPIN_ADJ(t->active_threads, 1);
                    ssize_t rres = read(ti->child_fd, read_buf, NOTIFY_MSG_LEN);
                    if (rres < 0) {