summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/mempool.c21
-rw-r--r--lib/resource.h2
-rw-r--r--proto/ospf/ospf.c3
-rw-r--r--sysdep/unix/main.c9
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;