Message ID | 1333442297-18932-6-git-send-email-laijs@cn.fujitsu.com |
---|---|
State | New |
Headers | show |
Il 03/04/2012 10:38, Lai Jiangshan ha scritto: > runnable coroutine queue is the core mangement of the coroutine. > > Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> > --- > qemu-coroutine-lock.c | 27 --------------------------- > qemu-coroutine.c | 27 +++++++++++++++++++++++++++ > qemu-coroutine.h | 7 +++++++ > trace-events | 2 +- > 4 files changed, 35 insertions(+), 28 deletions(-) > > diff --git a/qemu-coroutine-lock.c b/qemu-coroutine-lock.c > index 6f47685..159d66d 100644 > --- a/qemu-coroutine-lock.c > +++ b/qemu-coroutine-lock.c > @@ -26,35 +26,8 @@ > #include "qemu-coroutine.h" > #include "qemu-coroutine-int.h" > #include "qemu-queue.h" > -#include "main-loop.h" > #include "trace.h" > > -static QTAILQ_HEAD(, Coroutine) co_runnable_queue = > - QTAILQ_HEAD_INITIALIZER(co_runnable_queue); > -static QEMUBH* co_runnable_bh; > - > -static void qemu_co_process_runnable(void *opaque) > -{ > - Coroutine *next; > - > - trace_qemu_co_process_runnable(); > - while ((next = QTAILQ_FIRST(&co_runnable_queue))) { > - QTAILQ_REMOVE(&co_runnable_queue, next, co_queue_next); > - qemu_coroutine_enter(next, NULL); > - } > -} > - > -static void qemu_co_runnable_schedule(Coroutine *co) > -{ > - QTAILQ_INSERT_TAIL(&co_runnable_queue, co, co_queue_next); > - qemu_bh_schedule(co_runnable_bh); > -} > - > -static void __attribute__((constructor)) co_runnable_bh_init(void) > -{ > - co_runnable_bh = qemu_bh_new(qemu_co_process_runnable, NULL); > -} > - > void qemu_co_queue_init(CoQueue *queue) > { > QTAILQ_INIT(&queue->entries); > diff --git a/qemu-coroutine.c b/qemu-coroutine.c > index c01252e..c67d557 100644 > --- a/qemu-coroutine.c > +++ b/qemu-coroutine.c > @@ -16,6 +16,33 @@ > #include "qemu-common.h" > #include "qemu-coroutine.h" > #include "qemu-coroutine-int.h" > +#include "main-loop.h" > + > +static QTAILQ_HEAD(, Coroutine) co_runnable_queue = > + QTAILQ_HEAD_INITIALIZER(co_runnable_queue); > +static QEMUBH* co_runnable_bh; > + > +static void qemu_co_process_runnable(void *opaque) > +{ > + Coroutine *next; > + > + trace_qemu_co_process_runnable(); > + while ((next = QTAILQ_FIRST(&co_runnable_queue))) { > + QTAILQ_REMOVE(&co_runnable_queue, next, co_queue_next); > + qemu_coroutine_enter(next, NULL); > + } > +} > + > +void qemu_co_runnable_schedule(Coroutine *co) > +{ > + QTAILQ_INSERT_TAIL(&co_runnable_queue, co, co_queue_next); > + qemu_bh_schedule(co_runnable_bh); > +} > + > +static void __attribute__((constructor)) co_runnable_bh_init(void) > +{ > + co_runnable_bh = qemu_bh_new(qemu_co_process_runnable, NULL); > +} > > Coroutine *qemu_coroutine_create(CoroutineEntry *entry) > { > diff --git a/qemu-coroutine.h b/qemu-coroutine.h > index 34c15d4..82a7e5c 100644 > --- a/qemu-coroutine.h > +++ b/qemu-coroutine.h > @@ -82,6 +82,13 @@ void qemu_coroutine_enter(Coroutine *coroutine, void *opaque); > void coroutine_fn qemu_coroutine_yield(void); > > /** > + * Add a coroutine to runnable to runnable queue > + * > + * The coroutine will be processed later. > + */ > +void qemu_co_runnable_schedule(Coroutine *co); > + > +/** > * Get the currently executing coroutine > */ > Coroutine *coroutine_fn qemu_coroutine_self(void); > diff --git a/trace-events b/trace-events > index a1737c2..39b9c84 100644 > --- a/trace-events > +++ b/trace-events > @@ -556,12 +556,12 @@ qemu_put_ram_ptr(void* addr) "%p" > xen_platform_log(char *s) "xen platform: %s" > > # qemu-coroutine.c > +qemu_co_process_runnable(void) "" > qemu_coroutine_enter(void *from, void *to, void *opaque) "from %p to %p opaque %p" > qemu_coroutine_yield(void *from, void *to) "from %p to %p" > qemu_coroutine_terminate(void *co) "self %p" > > # qemu-coroutine-lock.c > -qemu_co_process_runnable(void) "" > qemu_co_queue_next(void *next) "next %p" > qemu_co_mutex_lock_entry(void *mutex, void *self) "mutex %p self %p" > qemu_co_mutex_lock_return(void *mutex, void *self) "mutex %p self %p" I think the point here was to have qemu-coroutine.c not depend on the QEMU main loop, so this is not ok. Paolo
diff --git a/qemu-coroutine-lock.c b/qemu-coroutine-lock.c index 6f47685..159d66d 100644 --- a/qemu-coroutine-lock.c +++ b/qemu-coroutine-lock.c @@ -26,35 +26,8 @@ #include "qemu-coroutine.h" #include "qemu-coroutine-int.h" #include "qemu-queue.h" -#include "main-loop.h" #include "trace.h" -static QTAILQ_HEAD(, Coroutine) co_runnable_queue = - QTAILQ_HEAD_INITIALIZER(co_runnable_queue); -static QEMUBH* co_runnable_bh; - -static void qemu_co_process_runnable(void *opaque) -{ - Coroutine *next; - - trace_qemu_co_process_runnable(); - while ((next = QTAILQ_FIRST(&co_runnable_queue))) { - QTAILQ_REMOVE(&co_runnable_queue, next, co_queue_next); - qemu_coroutine_enter(next, NULL); - } -} - -static void qemu_co_runnable_schedule(Coroutine *co) -{ - QTAILQ_INSERT_TAIL(&co_runnable_queue, co, co_queue_next); - qemu_bh_schedule(co_runnable_bh); -} - -static void __attribute__((constructor)) co_runnable_bh_init(void) -{ - co_runnable_bh = qemu_bh_new(qemu_co_process_runnable, NULL); -} - void qemu_co_queue_init(CoQueue *queue) { QTAILQ_INIT(&queue->entries); diff --git a/qemu-coroutine.c b/qemu-coroutine.c index c01252e..c67d557 100644 --- a/qemu-coroutine.c +++ b/qemu-coroutine.c @@ -16,6 +16,33 @@ #include "qemu-common.h" #include "qemu-coroutine.h" #include "qemu-coroutine-int.h" +#include "main-loop.h" + +static QTAILQ_HEAD(, Coroutine) co_runnable_queue = + QTAILQ_HEAD_INITIALIZER(co_runnable_queue); +static QEMUBH* co_runnable_bh; + +static void qemu_co_process_runnable(void *opaque) +{ + Coroutine *next; + + trace_qemu_co_process_runnable(); + while ((next = QTAILQ_FIRST(&co_runnable_queue))) { + QTAILQ_REMOVE(&co_runnable_queue, next, co_queue_next); + qemu_coroutine_enter(next, NULL); + } +} + +void qemu_co_runnable_schedule(Coroutine *co) +{ + QTAILQ_INSERT_TAIL(&co_runnable_queue, co, co_queue_next); + qemu_bh_schedule(co_runnable_bh); +} + +static void __attribute__((constructor)) co_runnable_bh_init(void) +{ + co_runnable_bh = qemu_bh_new(qemu_co_process_runnable, NULL); +} Coroutine *qemu_coroutine_create(CoroutineEntry *entry) { diff --git a/qemu-coroutine.h b/qemu-coroutine.h index 34c15d4..82a7e5c 100644 --- a/qemu-coroutine.h +++ b/qemu-coroutine.h @@ -82,6 +82,13 @@ void qemu_coroutine_enter(Coroutine *coroutine, void *opaque); void coroutine_fn qemu_coroutine_yield(void); /** + * Add a coroutine to runnable to runnable queue + * + * The coroutine will be processed later. + */ +void qemu_co_runnable_schedule(Coroutine *co); + +/** * Get the currently executing coroutine */ Coroutine *coroutine_fn qemu_coroutine_self(void); diff --git a/trace-events b/trace-events index a1737c2..39b9c84 100644 --- a/trace-events +++ b/trace-events @@ -556,12 +556,12 @@ qemu_put_ram_ptr(void* addr) "%p" xen_platform_log(char *s) "xen platform: %s" # qemu-coroutine.c +qemu_co_process_runnable(void) "" qemu_coroutine_enter(void *from, void *to, void *opaque) "from %p to %p opaque %p" qemu_coroutine_yield(void *from, void *to) "from %p to %p" qemu_coroutine_terminate(void *co) "self %p" # qemu-coroutine-lock.c -qemu_co_process_runnable(void) "" qemu_co_queue_next(void *next) "next %p" qemu_co_mutex_lock_entry(void *mutex, void *self) "mutex %p self %p" qemu_co_mutex_lock_return(void *mutex, void *self) "mutex %p self %p"
runnable coroutine queue is the core mangement of the coroutine. Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> --- qemu-coroutine-lock.c | 27 --------------------------- qemu-coroutine.c | 27 +++++++++++++++++++++++++++ qemu-coroutine.h | 7 +++++++ trace-events | 2 +- 4 files changed, 35 insertions(+), 28 deletions(-)