Loading src/lib/bus/sender.c +7 −5 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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); Loading Loading @@ -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; } } } Loading src/lib/threadpool/threadpool.c +21 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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) { Loading Loading
src/lib/bus/sender.c +7 −5 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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); Loading Loading @@ -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; } } } Loading
src/lib/threadpool/threadpool.c +21 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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) { Loading