diff options
-rw-r--r-- | lib/mempool.c | 21 | ||||
-rw-r--r-- | lib/resource.h | 2 | ||||
-rw-r--r-- | proto/ospf/ospf.c | 3 | ||||
-rw-r--r-- | sysdep/unix/main.c | 9 |
4 files changed, 31 insertions, 4 deletions
diff --git a/lib/mempool.c b/lib/mempool.c index 169826d4..f9a9aaca 100644 --- a/lib/mempool.c +++ b/lib/mempool.c @@ -37,9 +37,10 @@ const int lp_chunk_size = sizeof(struct lp_chunk); struct linpool { resource r; byte *ptr, *end; + pool *p; struct lp_chunk *first, *current; /* Normal (reusable) chunks */ struct lp_chunk *first_large; /* Large chunks */ - uint chunk_size, threshold, total, total_large; + uint chunk_size, threshold, total:31, use_pages:1, total_large; }; _Thread_local linpool *tmp_linpool; @@ -71,6 +72,13 @@ linpool *lp_new(pool *p, uint blk) { linpool *m = ralloc(p, &lp_class); + m->p = p; + if (!blk) + { + m->use_pages = 1; + blk = page_size - lp_chunk_size; + } + m->chunk_size = blk; m->threshold = 3*blk/4; return m; @@ -123,7 +131,11 @@ lp_alloc(linpool *m, uint size) else { /* Need to allocate a new chunk */ - c = xmalloc(sizeof(struct lp_chunk) + m->chunk_size); + if (m->use_pages) + c = alloc_page(m->p); + else + c = xmalloc(sizeof(struct lp_chunk) + m->chunk_size); + m->total += m->chunk_size; c->next = NULL; c->size = m->chunk_size; @@ -260,7 +272,10 @@ lp_free(resource *r) for(d=m->first; d; d = c) { c = d->next; - xfree(d); + if (m->use_pages) + free_page(m->p, d); + else + xfree(d); } for(d=m->first_large; d; d = c) { diff --git a/lib/resource.h b/lib/resource.h index 992fa5b2..313b01dc 100644 --- a/lib/resource.h +++ b/lib/resource.h @@ -91,7 +91,7 @@ extern _Thread_local linpool *tmp_linpool; /* Temporary linpool autoflushed regu 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) -#define lp_new_default(p) lp_new(p, LP_GOOD_SIZE(LP_GAS*4)) +#define lp_new_default(p) lp_new(p, 0) /* Slabs */ diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index ba8c2e2b..ebebf0ff 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -558,6 +558,9 @@ ospf_shutdown(struct proto *P) } FIB_WALK_END; + if (tm_active(p->disp_timer)) + tm_stop(p->disp_timer); + return PS_DOWN; } diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index 392aff9d..cdf0a310 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -479,6 +479,14 @@ cli_err(sock *s, int err) cli_free(s->data); } +static void +cli_connect_err(sock *s UNUSED, int err) +{ + ASSERT_DIE(err); + if (config->cli_debug) + log(L_INFO "Failed to accept CLI connection: %s", strerror(err)); +} + static int cli_connect(sock *s, uint size UNUSED) { @@ -507,6 +515,7 @@ cli_init_unix(uid_t use_uid, gid_t use_gid) s = cli_sk = sk_new(cli_pool); s->type = SK_UNIX_PASSIVE; s->rx_hook = cli_connect; + s->err_hook = cli_connect_err; s->rbsize = 1024; s->fast_rx = 1; |