summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-03-02 10:35:21 +0100
committerMaria Matejka <mq@ucw.cz>2022-03-02 12:13:49 +0100
commit48bf1322aa141ca6259b26b37551402758cff0cc (patch)
treeb900a58ac1356bf3724cfa226070ff97df3d52d5
parent2e8b8bfcc46ec1493f9e0efe9c796b88df85ada4 (diff)
Introducing an universal temporary linpool flushed after every task
-rw-r--r--lib/event.c2
-rw-r--r--lib/mempool.c2
-rw-r--r--lib/resource.c1
-rw-r--r--lib/resource.h9
-rw-r--r--lib/timer.c1
-rw-r--r--proto/bfd/io.c2
-rw-r--r--sysdep/unix/io.c23
-rw-r--r--test/birdtest.c4
-rw-r--r--test/bt-utils.c1
9 files changed, 41 insertions, 4 deletions
diff --git a/lib/event.c b/lib/event.c
index 273447e0..33dc00b0 100644
--- a/lib/event.c
+++ b/lib/event.c
@@ -157,6 +157,7 @@ ev_run_list(event_list *l)
io_log_event(e->hook, e->data);
ev_run(e);
+ tmp_flush();
}
return !EMPTY_LIST(*l);
@@ -184,6 +185,7 @@ ev_run_list_limited(event_list *l, uint limit)
io_log_event(e->hook, e->data);
ev_run(e);
+ tmp_flush();
limit--;
}
diff --git a/lib/mempool.c b/lib/mempool.c
index 90d7c774..169826d4 100644
--- a/lib/mempool.c
+++ b/lib/mempool.c
@@ -42,6 +42,8 @@ struct linpool {
uint chunk_size, threshold, total, total_large;
};
+_Thread_local linpool *tmp_linpool;
+
static void lp_free(resource *);
static void lp_dump(resource *);
static resource *lp_lookup(resource *, unsigned long);
diff --git a/lib/resource.c b/lib/resource.c
index 5d4c7780..5636872c 100644
--- a/lib/resource.c
+++ b/lib/resource.c
@@ -273,6 +273,7 @@ resource_init(void)
root_pool.r.class = &pool_class;
root_pool.name = "Root";
init_list(&root_pool.inside);
+ tmp_init(&root_pool);
}
/**
diff --git a/lib/resource.h b/lib/resource.h
index 9ec41ed8..0e4c44d8 100644
--- a/lib/resource.h
+++ b/lib/resource.h
@@ -79,6 +79,15 @@ void lp_flush(linpool *); /* Free everything, but leave linpool */
void lp_save(linpool *m, lp_state *p); /* Save state */
void lp_restore(linpool *m, lp_state *p); /* Restore state */
+extern _Thread_local linpool *tmp_linpool; /* Temporary linpool autoflushed regularily */
+
+#define tmp_alloc(sz) lp_alloc(tmp_linpool, sz)
+#define tmp_allocu(sz) lp_allocu(tmp_linpool, sz)
+#define tmp_allocz(sz) lp_allocz(tmp_linpool, sz)
+
+#define tmp_init(p) tmp_linpool = lp_new_default(p)
+#define tmp_flush() lp_flush(tmp_linpool)
+
extern const int lp_chunk_size;
#define LP_GAS 1024
#define LP_GOOD_SIZE(x) (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size)
diff --git a/lib/timer.c b/lib/timer.c
index 381163d0..c47e0bbc 100644
--- a/lib/timer.c
+++ b/lib/timer.c
@@ -233,6 +233,7 @@ timers_fire(struct timeloop *loop)
io_log_event(t->hook, t->data);
t->hook(t);
+ tmp_flush();
}
}
diff --git a/proto/bfd/io.c b/proto/bfd/io.c
index 1cd9365a..e696cc89 100644
--- a/proto/bfd/io.c
+++ b/proto/bfd/io.c
@@ -482,6 +482,8 @@ birdloop_main(void *arg)
birdloop_set_current(loop);
+ tmp_init(loop->pool);
+
pthread_mutex_lock(&loop->mutex);
while (1)
{
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index 4fd77453..8a116789 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -1854,8 +1854,8 @@ sk_read_ssh(sock *s)
/* sk_read() and sk_write() are called from BFD's event loop */
-int
-sk_read(sock *s, int revents)
+static inline int
+sk_read_noflush(sock *s, int revents)
{
switch (s->type)
{
@@ -1918,7 +1918,15 @@ sk_read(sock *s, int revents)
}
int
-sk_write(sock *s)
+sk_read(sock *s, int revents)
+{
+ int e = sk_read_noflush(s, revents);
+ tmp_flush();
+ return e;
+}
+
+static inline int
+sk_write_noflush(sock *s)
{
switch (s->type)
{
@@ -1966,6 +1974,14 @@ sk_write(sock *s)
}
}
+int
+sk_write(sock *s)
+{
+ int e = sk_write_noflush(s);
+ tmp_flush();
+ return e;
+}
+
int sk_is_ipv4(sock *s)
{ return s->af == AF_INET; }
@@ -1984,6 +2000,7 @@ sk_err(sock *s, int revents)
}
s->err_hook(s, se);
+ tmp_flush();
}
void
diff --git a/test/birdtest.c b/test/birdtest.c
index 86a8882f..10d6d6de 100644
--- a/test/birdtest.c
+++ b/test/birdtest.c
@@ -119,6 +119,8 @@ bt_init(int argc, char *argv[])
clock_gettime(CLOCK_MONOTONIC, &bt_begin);
bt_suite_case_begin = bt_suite_begin = bt_begin;
+ resource_init();
+
return;
usage:
@@ -172,6 +174,8 @@ int bt_run_test_fn(int (*fn)(const void *), const void *fn_arg, int timeout)
if (!bt_suite_result)
result = 0;
+ tmp_flush();
+
return result;
}
diff --git a/test/bt-utils.c b/test/bt-utils.c
index cbca3a6b..2a7799c3 100644
--- a/test/bt-utils.c
+++ b/test/bt-utils.c
@@ -60,7 +60,6 @@ bt_bird_init(void)
log_init_debug("");
log_switch(bt_verbose != 0, NULL, NULL);
- resource_init();
olock_init();
timer_init();
io_init();