15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef __QEMU_THREAD_H 25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define __QEMU_THREAD_H 1 35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 4086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#include <inttypes.h> 5086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#include <stdbool.h> 65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct QemuMutex QemuMutex; 85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct QemuCond QemuCond; 9086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnertypedef struct QemuSemaphore QemuSemaphore; 10086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnertypedef struct QemuEvent QemuEvent; 115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct QemuThread QemuThread; 125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 13086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#ifdef _WIN32 14086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#include "qemu/thread-win32.h" 15086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#else 16086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#include "qemu/thread-posix.h" 17086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#endif 18086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner 19086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#define QEMU_THREAD_JOINABLE 0 20086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#define QEMU_THREAD_DETACHED 1 21086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner 225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_mutex_init(QemuMutex *mutex); 230c0b2b4e96b030854987b16a779e30a3741d3b0dDavid Turnervoid qemu_mutex_destroy(QemuMutex *mutex); 245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_mutex_lock(QemuMutex *mutex); 255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_mutex_trylock(QemuMutex *mutex); 265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_mutex_timedlock(QemuMutex *mutex, uint64_t msecs); 275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_mutex_unlock(QemuMutex *mutex); 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 29086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#define rcu_read_lock() do { } while (0) 30086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner#define rcu_read_unlock() do { } while (0) 31086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner 325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_cond_init(QemuCond *cond); 330c0b2b4e96b030854987b16a779e30a3741d3b0dDavid Turnervoid qemu_cond_destroy(QemuCond *cond); 34086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner 35086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner/* 36086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner * IMPORTANT: The implementation does not guarantee that pthread_cond_signal 37086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner * and pthread_cond_broadcast can be called except while the same mutex is 38086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner * held as in the corresponding pthread_cond_wait calls! 39086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner */ 405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_cond_signal(QemuCond *cond); 415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_cond_broadcast(QemuCond *cond); 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_cond_wait(QemuCond *cond, QemuMutex *mutex); 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_cond_timedwait(QemuCond *cond, QemuMutex *mutex, uint64_t msecs); 445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 45086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_sem_init(QemuSemaphore *sem, int init); 46086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_sem_post(QemuSemaphore *sem); 47086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_sem_wait(QemuSemaphore *sem); 48086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnerint qemu_sem_timedwait(QemuSemaphore *sem, int ms); 49086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_sem_destroy(QemuSemaphore *sem); 50086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner 51086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_event_init(QemuEvent *ev, bool init); 52086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_event_set(QemuEvent *ev); 53086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_event_reset(QemuEvent *ev); 54086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_event_wait(QemuEvent *ev); 55086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_event_destroy(QemuEvent *ev); 56086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner 575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_thread_create(QemuThread *thread, 58086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner void *(*start_routine)(void *), 59086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turner void *arg, int mode); 60086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid *qemu_thread_join(QemuThread *thread); 61086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnervoid qemu_thread_get_self(QemuThread *thread); 62086e66e13d37c79da0cd90b92f0127c869aa7b9dDavid 'Digit' Turnerbool qemu_thread_is_self(QemuThread *thread); 630c0b2b4e96b030854987b16a779e30a3741d3b0dDavid Turnervoid qemu_thread_exit(void *retval); 640c0b2b4e96b030854987b16a779e30a3741d3b0dDavid Turner 655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 66