diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pulp.c | 31 | ||||
-rw-r--r-- | src/pulp.h | 1 |
2 files changed, 32 insertions, 0 deletions
@@ -352,6 +352,35 @@ pulp_t * pulp_new(void) } +/* reset a pulp scheduler instance for reuse */ +void pulp_reset(pulp_t *pulp) +{ + pulp_fiber_t *f; + + assert(pulp); + + pulp->exited = 0; + pulp->now = now(); + + /* XXX: Note the idle queue isn't currently utilized */ + list_for_each_entry(f, &pulp->fibers.idle, fibers) + destroy_context(&f->context); + list_splice_init(&pulp->fibers.idle, &pulp->fibers.free); + + /* The run queue is drained per-tick, but newly created fibers + * with 0 delay go directly on the run queue. So it's possible + * there will be some there outside a tick. + */ + list_for_each_entry(f, &pulp->fibers.run, fibers) + destroy_context(&f->context); + list_splice_init(&pulp->fibers.run, &pulp->fibers.free); + + list_for_each_entry(f, &pulp->fibers.sleep, fibers) + destroy_context(&f->context); + list_splice_init(&pulp->fibers.sleep, &pulp->fibers.free); +} + + /* free a pulp scheduler instance */ void pulp_free(pulp_t *pulp) { @@ -359,6 +388,8 @@ void pulp_free(pulp_t *pulp) assert(pulp); + pulp_reset(pulp); + list_for_each_entry_safe(alloc, _alloc, &pulp->allocs, allocs) free(alloc); @@ -32,6 +32,7 @@ typedef struct pulp_mailbox_t { int pulp_init(void); pulp_t * pulp_new(void); +void pulp_reset(pulp_t *pulp); void pulp_free(pulp_t *pulp); int pulp_tick(pulp_t *pulp, unsigned *next_tick_delay_us); void pulp_run(pulp_t *pulp); |