mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-08 12:18:42 +00:00
Simplified temporary resources
Also TMP_SAVED now uses the CLEANUP hook to allow for breaks and returns
This commit is contained in:
parent
99afca53e3
commit
cd9d799abd
@ -207,6 +207,7 @@ lp_save(linpool *m)
|
|||||||
struct lp_state *p = lp_alloc(m, sizeof(struct lp_state));
|
struct lp_state *p = lp_alloc(m, sizeof(struct lp_state));
|
||||||
ASSERT_DIE(m->current);
|
ASSERT_DIE(m->current);
|
||||||
*p = (struct lp_state) {
|
*p = (struct lp_state) {
|
||||||
|
.p = m,
|
||||||
.current = m->current,
|
.current = m->current,
|
||||||
.large = m->first_large,
|
.large = m->first_large,
|
||||||
.total_large = m->total_large,
|
.total_large = m->total_large,
|
||||||
@ -233,6 +234,7 @@ lp_restore(linpool *m, lp_state *p)
|
|||||||
|
|
||||||
/* Move ptr to the saved pos and free all newer large chunks */
|
/* Move ptr to the saved pos and free all newer large chunks */
|
||||||
ASSERT_DIE(p->current);
|
ASSERT_DIE(p->current);
|
||||||
|
ASSERT_DIE(p->p == m);
|
||||||
m->current = c = p->current;
|
m->current = c = p->current;
|
||||||
m->ptr = (byte *) p;
|
m->ptr = (byte *) p;
|
||||||
m->end = c->data + LP_DATA_SIZE;
|
m->end = c->data + LP_DATA_SIZE;
|
||||||
|
@ -338,28 +338,22 @@ resource_init(void)
|
|||||||
|
|
||||||
root_pool.r.class = &pool_class;
|
root_pool.r.class = &pool_class;
|
||||||
rp_init(&root_pool, the_bird_domain.the_bird, "Root");
|
rp_init(&root_pool, the_bird_domain.the_bird, "Root");
|
||||||
tmp_init(&root_pool, the_bird_domain.the_bird);
|
tmp_init(&root_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
_Thread_local struct tmp_resources tmp_res;
|
_Thread_local linpool *tmp_linpool;
|
||||||
|
|
||||||
void
|
void
|
||||||
tmp_init(pool *p, struct domain_generic *dom)
|
tmp_init(pool *p)
|
||||||
{
|
{
|
||||||
tmp_res.lp = lp_new_default(p);
|
ASSERT_DIE(!tmp_linpool);
|
||||||
tmp_res.parent = p;
|
tmp_linpool = lp_new_default(p);
|
||||||
tmp_res.pool = rp_new(p, dom, "TMP");
|
|
||||||
tmp_res.domain = dom;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tmp_flush(void)
|
tmp_flush(void)
|
||||||
{
|
{
|
||||||
ASSERT_DIE(DG_IS_LOCKED(tmp_res.domain));
|
|
||||||
|
|
||||||
lp_flush(tmp_linpool);
|
lp_flush(tmp_linpool);
|
||||||
rp_free(tmp_res.pool);
|
|
||||||
tmp_res.pool = rp_new(tmp_res.parent, tmp_res.domain, "TMP");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ void mb_free(void *);
|
|||||||
typedef struct linpool linpool;
|
typedef struct linpool linpool;
|
||||||
|
|
||||||
typedef struct lp_state {
|
typedef struct lp_state {
|
||||||
|
struct linpool *p;
|
||||||
void *current, *large;
|
void *current, *large;
|
||||||
uint total_large;
|
uint total_large;
|
||||||
} lp_state;
|
} lp_state;
|
||||||
@ -103,28 +104,28 @@ void lp_flush(linpool *); /* Free everything, but leave linpool */
|
|||||||
lp_state *lp_save(linpool *m); /* Save state */
|
lp_state *lp_save(linpool *m); /* Save state */
|
||||||
void lp_restore(linpool *m, lp_state *p); /* Restore state */
|
void lp_restore(linpool *m, lp_state *p); /* Restore state */
|
||||||
|
|
||||||
#define LP_SAVED(m) for (struct lp_state *_lp_state = lp_save(m); _lp_state; lp_restore(m, _lp_state), _lp_state = NULL)
|
static inline void lp_saved_cleanup(struct lp_state **lps)
|
||||||
#define TMP_SAVED LP_SAVED(tmp_linpool)
|
{
|
||||||
|
if (*lps)
|
||||||
|
lp_restore((*lps)->p, (*lps));
|
||||||
|
}
|
||||||
|
|
||||||
struct tmp_resources {
|
#define LP_SAVED(m) for (CLEANUP(lp_saved_cleanup) struct lp_state *_lp_state = lp_save(m); _lp_state; lp_restore(m, _lp_state), _lp_state = NULL)
|
||||||
pool *pool, *parent;
|
|
||||||
linpool *lp;
|
|
||||||
struct domain_generic *domain;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern _Thread_local struct tmp_resources tmp_res;
|
#define lp_new_default lp_new
|
||||||
|
|
||||||
#define tmp_linpool tmp_res.lp
|
/* Thread-local temporary linpools */
|
||||||
|
|
||||||
|
extern _Thread_local linpool *tmp_linpool;
|
||||||
#define tmp_alloc(sz) lp_alloc(tmp_linpool, sz)
|
#define tmp_alloc(sz) lp_alloc(tmp_linpool, sz)
|
||||||
#define tmp_allocu(sz) lp_allocu(tmp_linpool, sz)
|
#define tmp_allocu(sz) lp_allocu(tmp_linpool, sz)
|
||||||
#define tmp_allocz(sz) lp_allocz(tmp_linpool, sz)
|
#define tmp_allocz(sz) lp_allocz(tmp_linpool, sz)
|
||||||
|
#define TMP_SAVED LP_SAVED(tmp_linpool)
|
||||||
|
|
||||||
void tmp_init(pool *p, struct domain_generic *dg);
|
void tmp_init(pool *p);
|
||||||
void tmp_flush(void);
|
void tmp_flush(void);
|
||||||
|
|
||||||
|
|
||||||
#define lp_new_default lp_new
|
|
||||||
|
|
||||||
/* Slabs */
|
/* Slabs */
|
||||||
|
|
||||||
typedef struct slab slab;
|
typedef struct slab slab;
|
||||||
|
@ -792,7 +792,7 @@ bird_thread_main(void *arg)
|
|||||||
birdloop_enter(thr->meta);
|
birdloop_enter(thr->meta);
|
||||||
this_birdloop = thr->meta;
|
this_birdloop = thr->meta;
|
||||||
|
|
||||||
tmp_init(thr->pool, birdloop_domain(thr->meta));
|
tmp_init(thr->pool);
|
||||||
init_list(&thr->loops);
|
init_list(&thr->loops);
|
||||||
|
|
||||||
defer_init(lp_new(thr->pool));
|
defer_init(lp_new(thr->pool));
|
||||||
|
Loading…
Reference in New Issue
Block a user