root / qemu-thread-posix.c @ 42138043
History | View | Annotate | Download (2.9 kB)
1 | e5d355d1 | aliguori | /*
|
---|---|---|---|
2 | e5d355d1 | aliguori | * Wrappers around mutex/cond/thread functions
|
3 | e5d355d1 | aliguori | *
|
4 | e5d355d1 | aliguori | * Copyright Red Hat, Inc. 2009
|
5 | e5d355d1 | aliguori | *
|
6 | e5d355d1 | aliguori | * Author:
|
7 | e5d355d1 | aliguori | * Marcelo Tosatti <mtosatti@redhat.com>
|
8 | e5d355d1 | aliguori | *
|
9 | e5d355d1 | aliguori | * This work is licensed under the terms of the GNU GPL, version 2 or later.
|
10 | e5d355d1 | aliguori | * See the COPYING file in the top-level directory.
|
11 | e5d355d1 | aliguori | *
|
12 | e5d355d1 | aliguori | */
|
13 | e5d355d1 | aliguori | #include <stdlib.h> |
14 | e5d355d1 | aliguori | #include <stdio.h> |
15 | e5d355d1 | aliguori | #include <errno.h> |
16 | e5d355d1 | aliguori | #include <time.h> |
17 | e5d355d1 | aliguori | #include <signal.h> |
18 | e5d355d1 | aliguori | #include <stdint.h> |
19 | e5d355d1 | aliguori | #include <string.h> |
20 | e5d355d1 | aliguori | #include "qemu-thread.h" |
21 | e5d355d1 | aliguori | |
22 | e5d355d1 | aliguori | static void error_exit(int err, const char *msg) |
23 | e5d355d1 | aliguori | { |
24 | e5d355d1 | aliguori | fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err));
|
25 | e5d355d1 | aliguori | exit(1);
|
26 | e5d355d1 | aliguori | } |
27 | e5d355d1 | aliguori | |
28 | e5d355d1 | aliguori | void qemu_mutex_init(QemuMutex *mutex)
|
29 | e5d355d1 | aliguori | { |
30 | e5d355d1 | aliguori | int err;
|
31 | 89b48b56 | Paolo Bonzini | pthread_mutexattr_t mutexattr; |
32 | e5d355d1 | aliguori | |
33 | 89b48b56 | Paolo Bonzini | pthread_mutexattr_init(&mutexattr); |
34 | 89b48b56 | Paolo Bonzini | pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK); |
35 | 89b48b56 | Paolo Bonzini | err = pthread_mutex_init(&mutex->lock, &mutexattr); |
36 | 89b48b56 | Paolo Bonzini | pthread_mutexattr_destroy(&mutexattr); |
37 | e5d355d1 | aliguori | if (err)
|
38 | e5d355d1 | aliguori | error_exit(err, __func__); |
39 | e5d355d1 | aliguori | } |
40 | e5d355d1 | aliguori | |
41 | 313b1d69 | Corentin Chary | void qemu_mutex_destroy(QemuMutex *mutex)
|
42 | 313b1d69 | Corentin Chary | { |
43 | 313b1d69 | Corentin Chary | int err;
|
44 | 313b1d69 | Corentin Chary | |
45 | 313b1d69 | Corentin Chary | err = pthread_mutex_destroy(&mutex->lock); |
46 | 313b1d69 | Corentin Chary | if (err)
|
47 | 313b1d69 | Corentin Chary | error_exit(err, __func__); |
48 | 313b1d69 | Corentin Chary | } |
49 | 313b1d69 | Corentin Chary | |
50 | e5d355d1 | aliguori | void qemu_mutex_lock(QemuMutex *mutex)
|
51 | e5d355d1 | aliguori | { |
52 | e5d355d1 | aliguori | int err;
|
53 | e5d355d1 | aliguori | |
54 | e5d355d1 | aliguori | err = pthread_mutex_lock(&mutex->lock); |
55 | e5d355d1 | aliguori | if (err)
|
56 | e5d355d1 | aliguori | error_exit(err, __func__); |
57 | e5d355d1 | aliguori | } |
58 | e5d355d1 | aliguori | |
59 | e5d355d1 | aliguori | int qemu_mutex_trylock(QemuMutex *mutex)
|
60 | e5d355d1 | aliguori | { |
61 | e5d355d1 | aliguori | return pthread_mutex_trylock(&mutex->lock);
|
62 | e5d355d1 | aliguori | } |
63 | e5d355d1 | aliguori | |
64 | e5d355d1 | aliguori | void qemu_mutex_unlock(QemuMutex *mutex)
|
65 | e5d355d1 | aliguori | { |
66 | e5d355d1 | aliguori | int err;
|
67 | e5d355d1 | aliguori | |
68 | e5d355d1 | aliguori | err = pthread_mutex_unlock(&mutex->lock); |
69 | e5d355d1 | aliguori | if (err)
|
70 | e5d355d1 | aliguori | error_exit(err, __func__); |
71 | e5d355d1 | aliguori | } |
72 | e5d355d1 | aliguori | |
73 | e5d355d1 | aliguori | void qemu_cond_init(QemuCond *cond)
|
74 | e5d355d1 | aliguori | { |
75 | e5d355d1 | aliguori | int err;
|
76 | e5d355d1 | aliguori | |
77 | e5d355d1 | aliguori | err = pthread_cond_init(&cond->cond, NULL);
|
78 | e5d355d1 | aliguori | if (err)
|
79 | e5d355d1 | aliguori | error_exit(err, __func__); |
80 | e5d355d1 | aliguori | } |
81 | e5d355d1 | aliguori | |
82 | 313b1d69 | Corentin Chary | void qemu_cond_destroy(QemuCond *cond)
|
83 | 313b1d69 | Corentin Chary | { |
84 | 313b1d69 | Corentin Chary | int err;
|
85 | 313b1d69 | Corentin Chary | |
86 | 313b1d69 | Corentin Chary | err = pthread_cond_destroy(&cond->cond); |
87 | 313b1d69 | Corentin Chary | if (err)
|
88 | 313b1d69 | Corentin Chary | error_exit(err, __func__); |
89 | 313b1d69 | Corentin Chary | } |
90 | 313b1d69 | Corentin Chary | |
91 | e5d355d1 | aliguori | void qemu_cond_signal(QemuCond *cond)
|
92 | e5d355d1 | aliguori | { |
93 | e5d355d1 | aliguori | int err;
|
94 | e5d355d1 | aliguori | |
95 | e5d355d1 | aliguori | err = pthread_cond_signal(&cond->cond); |
96 | e5d355d1 | aliguori | if (err)
|
97 | e5d355d1 | aliguori | error_exit(err, __func__); |
98 | e5d355d1 | aliguori | } |
99 | e5d355d1 | aliguori | |
100 | e5d355d1 | aliguori | void qemu_cond_broadcast(QemuCond *cond)
|
101 | e5d355d1 | aliguori | { |
102 | e5d355d1 | aliguori | int err;
|
103 | e5d355d1 | aliguori | |
104 | e5d355d1 | aliguori | err = pthread_cond_broadcast(&cond->cond); |
105 | e5d355d1 | aliguori | if (err)
|
106 | e5d355d1 | aliguori | error_exit(err, __func__); |
107 | e5d355d1 | aliguori | } |
108 | e5d355d1 | aliguori | |
109 | e5d355d1 | aliguori | void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
|
110 | e5d355d1 | aliguori | { |
111 | e5d355d1 | aliguori | int err;
|
112 | e5d355d1 | aliguori | |
113 | e5d355d1 | aliguori | err = pthread_cond_wait(&cond->cond, &mutex->lock); |
114 | e5d355d1 | aliguori | if (err)
|
115 | e5d355d1 | aliguori | error_exit(err, __func__); |
116 | e5d355d1 | aliguori | } |
117 | e5d355d1 | aliguori | |
118 | e5d355d1 | aliguori | void qemu_thread_create(QemuThread *thread,
|
119 | e5d355d1 | aliguori | void *(*start_routine)(void*), |
120 | e5d355d1 | aliguori | void *arg)
|
121 | e5d355d1 | aliguori | { |
122 | e5d355d1 | aliguori | int err;
|
123 | e5d355d1 | aliguori | |
124 | 55541c8a | Paolo Bonzini | /* Leave signal handling to the iothread. */
|
125 | 55541c8a | Paolo Bonzini | sigset_t set, oldset; |
126 | 55541c8a | Paolo Bonzini | |
127 | 55541c8a | Paolo Bonzini | sigfillset(&set); |
128 | 55541c8a | Paolo Bonzini | pthread_sigmask(SIG_SETMASK, &set, &oldset); |
129 | e5d355d1 | aliguori | err = pthread_create(&thread->thread, NULL, start_routine, arg);
|
130 | e5d355d1 | aliguori | if (err)
|
131 | e5d355d1 | aliguori | error_exit(err, __func__); |
132 | 55541c8a | Paolo Bonzini | |
133 | 55541c8a | Paolo Bonzini | pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
134 | e5d355d1 | aliguori | } |
135 | e5d355d1 | aliguori | |
136 | b7680cb6 | Jan Kiszka | void qemu_thread_get_self(QemuThread *thread)
|
137 | e5d355d1 | aliguori | { |
138 | e5d355d1 | aliguori | thread->thread = pthread_self(); |
139 | e5d355d1 | aliguori | } |
140 | e5d355d1 | aliguori | |
141 | b7680cb6 | Jan Kiszka | int qemu_thread_is_self(QemuThread *thread)
|
142 | e5d355d1 | aliguori | { |
143 | b7680cb6 | Jan Kiszka | return pthread_equal(pthread_self(), thread->thread);
|
144 | e5d355d1 | aliguori | } |
145 | e5d355d1 | aliguori | |
146 | 313b1d69 | Corentin Chary | void qemu_thread_exit(void *retval) |
147 | 313b1d69 | Corentin Chary | { |
148 | 313b1d69 | Corentin Chary | pthread_exit(retval); |
149 | 313b1d69 | Corentin Chary | } |