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