diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-02-19 11:59:09 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2013-02-22 21:21:10 +0100 |
commit | 402397843e20e35d6cb7c80837c7cfdb19ede591 (patch) | |
tree | 763a08ce9cab9e0b442acf24be6f152f5dc9bef4 /qemu-coroutine.c | |
parent | 4dc9f9d67dbf5d062d8db188b81cef435f291dd8 (diff) | |
download | qemu-402397843e20e35d6cb7c80837c7cfdb19ede591.zip qemu-402397843e20e35d6cb7c80837c7cfdb19ede591.tar.gz qemu-402397843e20e35d6cb7c80837c7cfdb19ede591.tar.bz2 |
coroutine: move pooling to common code
The coroutine pool code is duplicated between the ucontext and
sigaltstack backends, and absent from the win32 backend. But the
code can be shared easily by moving it to qemu-coroutine.c.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'qemu-coroutine.c')
-rw-r--r-- | qemu-coroutine.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/qemu-coroutine.c b/qemu-coroutine.c index 0f6e268..25a14c6 100644 --- a/qemu-coroutine.c +++ b/qemu-coroutine.c @@ -17,13 +17,54 @@ #include "block/coroutine.h" #include "block/coroutine_int.h" +enum { + /* Maximum free pool size prevents holding too many freed coroutines */ + POOL_MAX_SIZE = 64, +}; + +/** Free list to speed up creation */ +static QSLIST_HEAD(, Coroutine) pool = QSLIST_HEAD_INITIALIZER(pool); +static unsigned int pool_size; + Coroutine *qemu_coroutine_create(CoroutineEntry *entry) { - Coroutine *co = qemu_coroutine_new(); + Coroutine *co; + + co = QSLIST_FIRST(&pool); + if (co) { + QSLIST_REMOVE_HEAD(&pool, pool_next); + pool_size--; + } else { + co = qemu_coroutine_new(); + } + co->entry = entry; return co; } +static void coroutine_delete(Coroutine *co) +{ + if (pool_size < POOL_MAX_SIZE) { + QSLIST_INSERT_HEAD(&pool, co, pool_next); + co->caller = NULL; + pool_size++; + return; + } + + qemu_coroutine_delete(co); +} + +static void __attribute__((destructor)) coroutine_cleanup(void) +{ + Coroutine *co; + Coroutine *tmp; + + QSLIST_FOREACH_SAFE(co, &pool, pool_next, tmp) { + QSLIST_REMOVE_HEAD(&pool, pool_next); + qemu_coroutine_delete(co); + } +} + static void coroutine_swap(Coroutine *from, Coroutine *to) { CoroutineAction ret; @@ -35,7 +76,7 @@ static void coroutine_swap(Coroutine *from, Coroutine *to) return; case COROUTINE_TERMINATE: trace_qemu_coroutine_terminate(to); - qemu_coroutine_delete(to); + coroutine_delete(to); return; default: abort(); |