summaryrefslogtreecommitdiff
path: root/src/lib/timerwheel.c
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2020-11-23 20:01:19 +0100
committerSander Vrijders <sander@ouroboros.rocks>2020-11-25 15:35:27 +0100
commit4194300ec0af4e268bdb722ba13266352408009c (patch)
treef4b59c1a7dc914008de39543109d4c4cd9059a31 /src/lib/timerwheel.c
parent4c01338e4fb8aee6b28603e7e5f7459f59db9561 (diff)
downloadouroboros-4194300ec0af4e268bdb722ba13266352408009c.tar.gz
ouroboros-4194300ec0af4e268bdb722ba13266352408009c.zip
lib: Reduce timerwheel CPU consumption
The timerwheel is checked during IPC calls (fevent, flow_read), causing huge load on CPU consumption in IPCPs, since they have a lot of fevent() threads for QoS. The timerwheel will need further optimization), but for now I reduced the default tick time to 5 ms and added a boolean to check that the wheel is actually used. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/lib/timerwheel.c')
-rw-r--r--src/lib/timerwheel.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/lib/timerwheel.c b/src/lib/timerwheel.c
index cd3074cb..a9f3c72a 100644
--- a/src/lib/timerwheel.c
+++ b/src/lib/timerwheel.c
@@ -65,6 +65,8 @@ struct {
size_t prv_rxm; /* Last processed rxm slot at lvl 0. */
size_t prv_ack; /* Last processed ack slot. */
pthread_mutex_t lock;
+
+ bool in_use;
} rw;
static void timerwheel_fini(void)
@@ -140,6 +142,9 @@ static void timerwheel_move(void)
size_t i;
size_t j;
+ if (!__sync_bool_compare_and_swap(&rw.in_use, true, true))
+ return;
+
pthread_mutex_lock(&rw.lock);
pthread_cleanup_push((void (*) (void *)) pthread_mutex_unlock,
@@ -373,6 +378,8 @@ static int timerwheel_rxm(struct frcti * frcti,
#endif
pthread_mutex_unlock(&rw.lock);
+ __sync_bool_compare_and_swap(&rw.in_use, false, true);
+
return 0;
}
@@ -416,5 +423,7 @@ static int timerwheel_ack(int fd,
pthread_mutex_unlock(&rw.lock);
+ __sync_bool_compare_and_swap(&rw.in_use, false, true);
+
return 0;
}