Introducing an universal temporary linpool flushed after every task
This commit is contained in:
parent
2e8b8bfcc4
commit
48bf1322aa
9 changed files with 41 additions and 4 deletions
|
@ -157,6 +157,7 @@ ev_run_list(event_list *l)
|
||||||
io_log_event(e->hook, e->data);
|
io_log_event(e->hook, e->data);
|
||||||
|
|
||||||
ev_run(e);
|
ev_run(e);
|
||||||
|
tmp_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return !EMPTY_LIST(*l);
|
return !EMPTY_LIST(*l);
|
||||||
|
@ -184,6 +185,7 @@ ev_run_list_limited(event_list *l, uint limit)
|
||||||
io_log_event(e->hook, e->data);
|
io_log_event(e->hook, e->data);
|
||||||
|
|
||||||
ev_run(e);
|
ev_run(e);
|
||||||
|
tmp_flush();
|
||||||
limit--;
|
limit--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,8 @@ struct linpool {
|
||||||
uint chunk_size, threshold, total, total_large;
|
uint chunk_size, threshold, total, total_large;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_Thread_local linpool *tmp_linpool;
|
||||||
|
|
||||||
static void lp_free(resource *);
|
static void lp_free(resource *);
|
||||||
static void lp_dump(resource *);
|
static void lp_dump(resource *);
|
||||||
static resource *lp_lookup(resource *, unsigned long);
|
static resource *lp_lookup(resource *, unsigned long);
|
||||||
|
|
|
@ -273,6 +273,7 @@ resource_init(void)
|
||||||
root_pool.r.class = &pool_class;
|
root_pool.r.class = &pool_class;
|
||||||
root_pool.name = "Root";
|
root_pool.name = "Root";
|
||||||
init_list(&root_pool.inside);
|
init_list(&root_pool.inside);
|
||||||
|
tmp_init(&root_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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_save(linpool *m, lp_state *p); /* Save state */
|
||||||
void lp_restore(linpool *m, lp_state *p); /* Restore 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;
|
extern const int lp_chunk_size;
|
||||||
#define LP_GAS 1024
|
#define LP_GAS 1024
|
||||||
#define LP_GOOD_SIZE(x) (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size)
|
#define LP_GOOD_SIZE(x) (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size)
|
||||||
|
|
|
@ -233,6 +233,7 @@ timers_fire(struct timeloop *loop)
|
||||||
io_log_event(t->hook, t->data);
|
io_log_event(t->hook, t->data);
|
||||||
|
|
||||||
t->hook(t);
|
t->hook(t);
|
||||||
|
tmp_flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -482,6 +482,8 @@ birdloop_main(void *arg)
|
||||||
|
|
||||||
birdloop_set_current(loop);
|
birdloop_set_current(loop);
|
||||||
|
|
||||||
|
tmp_init(loop->pool);
|
||||||
|
|
||||||
pthread_mutex_lock(&loop->mutex);
|
pthread_mutex_lock(&loop->mutex);
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1854,8 +1854,8 @@ sk_read_ssh(sock *s)
|
||||||
|
|
||||||
/* sk_read() and sk_write() are called from BFD's event loop */
|
/* sk_read() and sk_write() are called from BFD's event loop */
|
||||||
|
|
||||||
int
|
static inline int
|
||||||
sk_read(sock *s, int revents)
|
sk_read_noflush(sock *s, int revents)
|
||||||
{
|
{
|
||||||
switch (s->type)
|
switch (s->type)
|
||||||
{
|
{
|
||||||
|
@ -1918,7 +1918,15 @@ sk_read(sock *s, int revents)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
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)
|
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)
|
int sk_is_ipv4(sock *s)
|
||||||
{ return s->af == AF_INET; }
|
{ return s->af == AF_INET; }
|
||||||
|
|
||||||
|
@ -1984,6 +2000,7 @@ sk_err(sock *s, int revents)
|
||||||
}
|
}
|
||||||
|
|
||||||
s->err_hook(s, se);
|
s->err_hook(s, se);
|
||||||
|
tmp_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -119,6 +119,8 @@ bt_init(int argc, char *argv[])
|
||||||
clock_gettime(CLOCK_MONOTONIC, &bt_begin);
|
clock_gettime(CLOCK_MONOTONIC, &bt_begin);
|
||||||
bt_suite_case_begin = bt_suite_begin = bt_begin;
|
bt_suite_case_begin = bt_suite_begin = bt_begin;
|
||||||
|
|
||||||
|
resource_init();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
usage:
|
usage:
|
||||||
|
@ -172,6 +174,8 @@ int bt_run_test_fn(int (*fn)(const void *), const void *fn_arg, int timeout)
|
||||||
if (!bt_suite_result)
|
if (!bt_suite_result)
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
|
tmp_flush();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,6 @@ bt_bird_init(void)
|
||||||
log_init_debug("");
|
log_init_debug("");
|
||||||
log_switch(bt_verbose != 0, NULL, NULL);
|
log_switch(bt_verbose != 0, NULL, NULL);
|
||||||
|
|
||||||
resource_init();
|
|
||||||
olock_init();
|
olock_init();
|
||||||
timer_init();
|
timer_init();
|
||||||
io_init();
|
io_init();
|
||||||
|
|
Loading…
Reference in a new issue