aboutsummaryrefslogtreecommitdiff
path: root/coroutine-sigaltstack.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-02-19 11:59:09 +0100
committerKevin Wolf <kwolf@redhat.com>2013-02-22 21:21:10 +0100
commit402397843e20e35d6cb7c80837c7cfdb19ede591 (patch)
tree763a08ce9cab9e0b442acf24be6f152f5dc9bef4 /coroutine-sigaltstack.c
parent4dc9f9d67dbf5d062d8db188b81cef435f291dd8 (diff)
downloadqemu-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 'coroutine-sigaltstack.c')
-rw-r--r--coroutine-sigaltstack.c43
1 files changed, 1 insertions, 42 deletions
diff --git a/coroutine-sigaltstack.c b/coroutine-sigaltstack.c
index e37ebac..b4d1762 100644
--- a/coroutine-sigaltstack.c
+++ b/coroutine-sigaltstack.c
@@ -33,15 +33,6 @@
#include "qemu-common.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;
-
typedef struct {
Coroutine base;
void *stack;
@@ -85,17 +76,6 @@ static void qemu_coroutine_thread_cleanup(void *opaque)
g_free(s);
}
-static void __attribute__((destructor)) coroutine_cleanup(void)
-{
- Coroutine *co;
- Coroutine *tmp;
-
- QSLIST_FOREACH_SAFE(co, &pool, pool_next, tmp) {
- g_free(DO_UPCAST(CoroutineUContext, base, co)->stack);
- g_free(co);
- }
-}
-
static void __attribute__((constructor)) coroutine_init(void)
{
int ret;
@@ -164,7 +144,7 @@ static void coroutine_trampoline(int signal)
coroutine_bootstrap(self, co);
}
-static Coroutine *coroutine_new(void)
+Coroutine *qemu_coroutine_new(void)
{
const size_t stack_size = 1 << 20;
CoroutineUContext *co;
@@ -272,31 +252,10 @@ static Coroutine *coroutine_new(void)
return &co->base;
}
-Coroutine *qemu_coroutine_new(void)
-{
- Coroutine *co;
-
- co = QSLIST_FIRST(&pool);
- if (co) {
- QSLIST_REMOVE_HEAD(&pool, pool_next);
- pool_size--;
- } else {
- co = coroutine_new();
- }
- return co;
-}
-
void qemu_coroutine_delete(Coroutine *co_)
{
CoroutineUContext *co = DO_UPCAST(CoroutineUContext, base, co_);
- if (pool_size < POOL_MAX_SIZE) {
- QSLIST_INSERT_HEAD(&pool, &co->base, pool_next);
- co->base.caller = NULL;
- pool_size++;
- return;
- }
-
g_free(co->stack);
g_free(co);
}