qemu/include/qemu/coroutine.h
<<
>>
Prefs
   1/*
   2 * QEMU coroutine implementation
   3 *
   4 * Copyright IBM, Corp. 2011
   5 *
   6 * Authors:
   7 *  Stefan Hajnoczi    <stefanha@linux.vnet.ibm.com>
   8 *  Kevin Wolf         <kwolf@redhat.com>
   9 *
  10 * This work is licensed under the terms of the GNU LGPL, version 2 or later.
  11 * See the COPYING.LIB file in the top-level directory.
  12 *
  13 */
  14
  15#ifndef QEMU_COROUTINE_H
  16#define QEMU_COROUTINE_H
  17
  18#include "qemu/queue.h"
  19#include "qemu/timer.h"
  20
  21/**
  22 * Coroutines are a mechanism for stack switching and can be used for
  23 * cooperative userspace threading.  These functions provide a simple but
  24 * useful flavor of coroutines that is suitable for writing sequential code,
  25 * rather than callbacks, for operations that need to give up control while
  26 * waiting for events to complete.
  27 *
  28 * These functions are re-entrant and may be used outside the global mutex.
  29 */
  30
  31/**
  32 * Mark a function that executes in coroutine context
  33 *
  34 * Functions that execute in coroutine context cannot be called directly from
  35 * normal functions.  In the future it would be nice to enable compiler or
  36 * static checker support for catching such errors.  This annotation might make
  37 * it possible and in the meantime it serves as documentation.
  38 *
  39 * For example:
  40 *
  41 *   static void coroutine_fn foo(void) {
  42 *       ....
  43 *   }
  44 */
  45#define coroutine_fn
  46
  47typedef struct Coroutine Coroutine;
  48
  49/**
  50 * Coroutine entry point
  51 *
  52 * When the coroutine is entered for the first time, opaque is passed in as an
  53 * argument.
  54 *
  55 * When this function returns, the coroutine is destroyed automatically and
  56 * execution continues in the caller who last entered the coroutine.
  57 */
  58typedef void coroutine_fn CoroutineEntry(void *opaque);
  59
  60/**
  61 * Create a new coroutine
  62 *
  63 * Use qemu_coroutine_enter() to actually transfer control to the coroutine.
  64 * The opaque argument is passed as the argument to the entry point.
  65 */
  66Coroutine *qemu_coroutine_create(CoroutineEntry *entry, void *opaque);
  67
  68/**
  69 * Transfer control to a coroutine
  70 */
  71void qemu_coroutine_enter(Coroutine *coroutine);
  72
  73/**
  74 * Transfer control back to a coroutine's caller
  75 *
  76 * This function does not return until the coroutine is re-entered using
  77 * qemu_coroutine_enter().
  78 */
  79void coroutine_fn qemu_coroutine_yield(void);
  80
  81/**
  82 * Get the currently executing coroutine
  83 */
  84Coroutine *coroutine_fn qemu_coroutine_self(void);
  85
  86/**
  87 * Return whether or not currently inside a coroutine
  88 *
  89 * This can be used to write functions that work both when in coroutine context
  90 * and when not in coroutine context.  Note that such functions cannot use the
  91 * coroutine_fn annotation since they work outside coroutine context.
  92 */
  93bool qemu_in_coroutine(void);
  94
  95/**
  96 * Return true if the coroutine is currently entered
  97 *
  98 * A coroutine is "entered" if it has not yielded from the current
  99 * qemu_coroutine_enter() call used to run it.  This does not mean that the
 100 * coroutine is currently executing code since it may have transferred control
 101 * to another coroutine using qemu_coroutine_enter().
 102 *
 103 * When several coroutines enter each other there may be no way to know which
 104 * ones have already been entered.  In such situations this function can be
 105 * used to avoid recursively entering coroutines.
 106 */
 107bool qemu_coroutine_entered(Coroutine *co);
 108
 109
 110/**
 111 * CoQueues are a mechanism to queue coroutines in order to continue executing
 112 * them later. They provide the fundamental primitives on which coroutine locks
 113 * are built.
 114 */
 115typedef struct CoQueue {
 116    QSIMPLEQ_HEAD(, Coroutine) entries;
 117} CoQueue;
 118
 119/**
 120 * Initialise a CoQueue. This must be called before any other operation is used
 121 * on the CoQueue.
 122 */
 123void qemu_co_queue_init(CoQueue *queue);
 124
 125/**
 126 * Adds the current coroutine to the CoQueue and transfers control to the
 127 * caller of the coroutine.
 128 */
 129void coroutine_fn qemu_co_queue_wait(CoQueue *queue);
 130
 131/**
 132 * Restarts the next coroutine in the CoQueue and removes it from the queue.
 133 *
 134 * Returns true if a coroutine was restarted, false if the queue is empty.
 135 */
 136bool coroutine_fn qemu_co_queue_next(CoQueue *queue);
 137
 138/**
 139 * Restarts all coroutines in the CoQueue and leaves the queue empty.
 140 */
 141void coroutine_fn qemu_co_queue_restart_all(CoQueue *queue);
 142
 143/**
 144 * Enter the next coroutine in the queue
 145 */
 146bool qemu_co_enter_next(CoQueue *queue);
 147
 148/**
 149 * Checks if the CoQueue is empty.
 150 */
 151bool qemu_co_queue_empty(CoQueue *queue);
 152
 153
 154/**
 155 * Provides a mutex that can be used to synchronise coroutines
 156 */
 157typedef struct CoMutex {
 158    bool locked;
 159    Coroutine *holder;
 160    CoQueue queue;
 161} CoMutex;
 162
 163/**
 164 * Initialises a CoMutex. This must be called before any other operation is used
 165 * on the CoMutex.
 166 */
 167void qemu_co_mutex_init(CoMutex *mutex);
 168
 169/**
 170 * Locks the mutex. If the lock cannot be taken immediately, control is
 171 * transferred to the caller of the current coroutine.
 172 */
 173void coroutine_fn qemu_co_mutex_lock(CoMutex *mutex);
 174
 175/**
 176 * Unlocks the mutex and schedules the next coroutine that was waiting for this
 177 * lock to be run.
 178 */
 179void coroutine_fn qemu_co_mutex_unlock(CoMutex *mutex);
 180
 181typedef struct CoRwlock {
 182    bool writer;
 183    int reader;
 184    CoQueue queue;
 185} CoRwlock;
 186
 187/**
 188 * Initialises a CoRwlock. This must be called before any other operation
 189 * is used on the CoRwlock
 190 */
 191void qemu_co_rwlock_init(CoRwlock *lock);
 192
 193/**
 194 * Read locks the CoRwlock. If the lock cannot be taken immediately because
 195 * of a parallel writer, control is transferred to the caller of the current
 196 * coroutine.
 197 */
 198void qemu_co_rwlock_rdlock(CoRwlock *lock);
 199
 200/**
 201 * Write Locks the mutex. If the lock cannot be taken immediately because
 202 * of a parallel reader, control is transferred to the caller of the current
 203 * coroutine.
 204 */
 205void qemu_co_rwlock_wrlock(CoRwlock *lock);
 206
 207/**
 208 * Unlocks the read/write lock and schedules the next coroutine that was
 209 * waiting for this lock to be run.
 210 */
 211void qemu_co_rwlock_unlock(CoRwlock *lock);
 212
 213/**
 214 * Yield the coroutine for a given duration
 215 *
 216 * Behaves similarly to co_sleep_ns(), but the sleeping coroutine will be
 217 * resumed when using aio_poll().
 218 */
 219void coroutine_fn co_aio_sleep_ns(AioContext *ctx, QEMUClockType type,
 220                                  int64_t ns);
 221
 222/**
 223 * Yield until a file descriptor becomes readable
 224 *
 225 * Note that this function clobbers the handlers for the file descriptor.
 226 */
 227void coroutine_fn yield_until_fd_readable(int fd);
 228
 229#endif /* QEMU_COROUTINE_H */
 230