X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=coroutine-ucontext.c;h=3d01075b06f739f7f9f9a3da5394c2d985d095f3;hb=refs%2Fheads%2Fstable-1.0;hp=42dc3e2cf672f36a43a1aa15e9b1a29144f75921;hpb=986563b173ca2d4bd47b10455b19c86e5cd5bba2;p=qemu.git diff --git a/coroutine-ucontext.c b/coroutine-ucontext.c index 42dc3e2cf..3d01075b0 100644 --- a/coroutine-ucontext.c +++ b/coroutine-ucontext.c @@ -35,6 +35,10 @@ enum { POOL_MAX_SIZE = 64, }; +/** Free list to speed up creation */ +static QLIST_HEAD(, Coroutine) pool = QLIST_HEAD_INITIALIZER(pool); +static unsigned int pool_size; + typedef struct { Coroutine base; void *stack; @@ -48,10 +52,6 @@ typedef struct { /** Currently executing coroutine */ Coroutine *current; - /** Free list to speed up creation */ - QLIST_HEAD(, Coroutine) pool; - unsigned int pool_size; - /** The default coroutine */ CoroutineUContext leader; } CoroutineThreadState; @@ -73,9 +73,8 @@ static CoroutineThreadState *coroutine_get_thread_state(void) CoroutineThreadState *s = pthread_getspecific(thread_state_key); if (!s) { - s = qemu_mallocz(sizeof(*s)); + s = g_malloc0(sizeof(*s)); s->current = &s->leader.base; - QLIST_INIT(&s->pool); pthread_setspecific(thread_state_key, s); } return s; @@ -84,14 +83,19 @@ static CoroutineThreadState *coroutine_get_thread_state(void) static void qemu_coroutine_thread_cleanup(void *opaque) { CoroutineThreadState *s = opaque; + + g_free(s); +} + +static void __attribute__((destructor)) coroutine_cleanup(void) +{ Coroutine *co; Coroutine *tmp; - QLIST_FOREACH_SAFE(co, &s->pool, pool_next, tmp) { - qemu_free(DO_UPCAST(CoroutineUContext, base, co)->stack); - qemu_free(co); + QLIST_FOREACH_SAFE(co, &pool, pool_next, tmp) { + g_free(DO_UPCAST(CoroutineUContext, base, co)->stack); + g_free(co); } - qemu_free(s); } static void __attribute__((constructor)) coroutine_init(void) @@ -146,8 +150,8 @@ static Coroutine *coroutine_new(void) abort(); } - co = qemu_mallocz(sizeof(*co)); - co->stack = qemu_malloc(stack_size); + co = g_malloc0(sizeof(*co)); + co->stack = g_malloc(stack_size); co->base.entry_arg = &old_env; /* stash away our jmp_buf */ uc.uc_link = &old_uc; @@ -169,13 +173,12 @@ static Coroutine *coroutine_new(void) Coroutine *qemu_coroutine_new(void) { - CoroutineThreadState *s = coroutine_get_thread_state(); Coroutine *co; - co = QLIST_FIRST(&s->pool); + co = QLIST_FIRST(&pool); if (co) { QLIST_REMOVE(co, pool_next); - s->pool_size--; + pool_size--; } else { co = coroutine_new(); } @@ -184,18 +187,17 @@ Coroutine *qemu_coroutine_new(void) void qemu_coroutine_delete(Coroutine *co_) { - CoroutineThreadState *s = coroutine_get_thread_state(); CoroutineUContext *co = DO_UPCAST(CoroutineUContext, base, co_); - if (s->pool_size < POOL_MAX_SIZE) { - QLIST_INSERT_HEAD(&s->pool, &co->base, pool_next); + if (pool_size < POOL_MAX_SIZE) { + QLIST_INSERT_HEAD(&pool, &co->base, pool_next); co->base.caller = NULL; - s->pool_size++; + pool_size++; return; } - qemu_free(co->stack); - qemu_free(co); + g_free(co->stack); + g_free(co); } CoroutineAction qemu_coroutine_switch(Coroutine *from_, Coroutine *to_,