struct lp_state *p = lp_alloc(m, sizeof(struct lp_state));
ASSERT_DIE(m->current);
*p = (struct lp_state) {
+ .p = m,
.current = m->current,
.large = m->first_large,
.total_large = m->total_large,
/* Move ptr to the saved pos and free all newer large chunks */
ASSERT_DIE(p->current);
+ ASSERT_DIE(p->p == m);
m->current = c = p->current;
m->ptr = (byte *) p;
m->end = c->data + LP_DATA_SIZE;
root_pool.r.class = &pool_class;
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
-tmp_init(pool *p, struct domain_generic *dom)
+tmp_init(pool *p)
{
- tmp_res.lp = lp_new_default(p);
- tmp_res.parent = p;
- tmp_res.pool = rp_new(p, dom, "TMP");
- tmp_res.domain = dom;
+ ASSERT_DIE(!tmp_linpool);
+ tmp_linpool = lp_new_default(p);
}
void
tmp_flush(void)
{
- ASSERT_DIE(DG_IS_LOCKED(tmp_res.domain));
-
lp_flush(tmp_linpool);
- rp_free(tmp_res.pool);
- tmp_res.pool = rp_new(tmp_res.parent, tmp_res.domain, "TMP");
}
typedef struct linpool linpool;
typedef struct lp_state {
+ struct linpool *p;
void *current, *large;
uint total_large;
} lp_state;
lp_state *lp_save(linpool *m); /* Save 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)
-#define TMP_SAVED LP_SAVED(tmp_linpool)
+static inline void lp_saved_cleanup(struct lp_state **lps)
+{
+ if (*lps)
+ lp_restore((*lps)->p, (*lps));
+}
-struct tmp_resources {
- pool *pool, *parent;
- linpool *lp;
- struct domain_generic *domain;
-};
+#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)
+
+#define lp_new_default lp_new
-extern _Thread_local struct tmp_resources tmp_res;
+/* Thread-local temporary linpools */
-#define tmp_linpool tmp_res.lp
+extern _Thread_local linpool *tmp_linpool;
#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_SAVED LP_SAVED(tmp_linpool)
-void tmp_init(pool *p, struct domain_generic *dg);
+void tmp_init(pool *p);
void tmp_flush(void);
-#define lp_new_default lp_new
-
/* Slabs */
typedef struct slab slab;