1#ifndef QEMU_THREAD_H
2#define QEMU_THREAD_H
3
4#include "qemu/processor.h"
5#include "qemu/atomic.h"
6
7typedef struct QemuMutex QemuMutex;
8typedef struct QemuCond QemuCond;
9typedef struct QemuSemaphore QemuSemaphore;
10typedef struct QemuEvent QemuEvent;
11typedef struct QemuThread QemuThread;
12
13#ifdef _WIN32
14#include "qemu/thread-win32.h"
15#else
16#include "qemu/thread-posix.h"
17#endif
18
19#define QEMU_THREAD_JOINABLE 0
20#define QEMU_THREAD_DETACHED 1
21
22void qemu_mutex_init(QemuMutex *mutex);
23void qemu_mutex_destroy(QemuMutex *mutex);
24void qemu_mutex_lock(QemuMutex *mutex);
25int qemu_mutex_trylock(QemuMutex *mutex);
26void qemu_mutex_unlock(QemuMutex *mutex);
27
28
29void qemu_rec_mutex_init(QemuRecMutex *mutex);
30
31void qemu_cond_init(QemuCond *cond);
32void qemu_cond_destroy(QemuCond *cond);
33
34
35
36
37
38
39void qemu_cond_signal(QemuCond *cond);
40void qemu_cond_broadcast(QemuCond *cond);
41void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex);
42
43void qemu_sem_init(QemuSemaphore *sem, int init);
44void qemu_sem_post(QemuSemaphore *sem);
45void qemu_sem_wait(QemuSemaphore *sem);
46int qemu_sem_timedwait(QemuSemaphore *sem, int ms);
47void qemu_sem_destroy(QemuSemaphore *sem);
48
49void qemu_event_init(QemuEvent *ev, bool init);
50void qemu_event_set(QemuEvent *ev);
51void qemu_event_reset(QemuEvent *ev);
52void qemu_event_wait(QemuEvent *ev);
53void qemu_event_destroy(QemuEvent *ev);
54
55void qemu_thread_create(QemuThread *thread, const char *name,
56 void *(*start_routine)(void *),
57 void *arg, int mode);
58void *qemu_thread_join(QemuThread *thread);
59void qemu_thread_get_self(QemuThread *thread);
60bool qemu_thread_is_self(QemuThread *thread);
61void qemu_thread_exit(void *retval);
62void qemu_thread_naming(bool enable);
63
64struct Notifier;
65void qemu_thread_atexit_add(struct Notifier *notifier);
66void qemu_thread_atexit_remove(struct Notifier *notifier);
67
68typedef struct QemuSpin {
69 int value;
70} QemuSpin;
71
72static inline void qemu_spin_init(QemuSpin *spin)
73{
74 __sync_lock_release(&spin->value);
75}
76
77static inline void qemu_spin_lock(QemuSpin *spin)
78{
79 while (unlikely(__sync_lock_test_and_set(&spin->value, true))) {
80 while (atomic_read(&spin->value)) {
81 cpu_relax();
82 }
83 }
84}
85
86static inline bool qemu_spin_trylock(QemuSpin *spin)
87{
88 return __sync_lock_test_and_set(&spin->value, true);
89}
90
91static inline bool qemu_spin_locked(QemuSpin *spin)
92{
93 return atomic_read(&spin->value);
94}
95
96static inline void qemu_spin_unlock(QemuSpin *spin)
97{
98 __sync_lock_release(&spin->value);
99}
100
101#endif
102