25
26
/** Free list to speed up creation */
27
static QemuMutex pool_lock;
26
28
static QSLIST_HEAD(, Coroutine) pool = QSLIST_HEAD_INITIALIZER(pool);
27
29
static unsigned int pool_size;
29
31
Coroutine *qemu_coroutine_create(CoroutineEntry *entry)
33
co = QSLIST_FIRST(&pool);
35
QSLIST_REMOVE_HEAD(&pool, pool_next);
35
if (CONFIG_COROUTINE_POOL) {
36
qemu_mutex_lock(&pool_lock);
37
co = QSLIST_FIRST(&pool);
39
QSLIST_REMOVE_HEAD(&pool, pool_next);
42
qemu_mutex_unlock(&pool_lock);
38
46
co = qemu_coroutine_new();
50
QTAILQ_INIT(&co->co_queue_wakeup);
45
54
static void coroutine_delete(Coroutine *co)
47
if (pool_size < POOL_MAX_SIZE) {
48
QSLIST_INSERT_HEAD(&pool, co, pool_next);
56
if (CONFIG_COROUTINE_POOL) {
57
qemu_mutex_lock(&pool_lock);
58
if (pool_size < POOL_MAX_SIZE) {
59
QSLIST_INSERT_HEAD(&pool, co, pool_next);
62
qemu_mutex_unlock(&pool_lock);
65
qemu_mutex_unlock(&pool_lock);
54
68
qemu_coroutine_delete(co);
57
static void __attribute__((destructor)) coroutine_cleanup(void)
71
static void __attribute__((constructor)) coroutine_pool_init(void)
73
qemu_mutex_init(&pool_lock);
76
static void __attribute__((destructor)) coroutine_pool_cleanup(void)
63
82
QSLIST_REMOVE_HEAD(&pool, pool_next);
64
83
qemu_coroutine_delete(co);
86
qemu_mutex_destroy(&pool_lock);
68
89
static void coroutine_swap(Coroutine *from, Coroutine *to)