Statistics
| Branch: | Revision:

root / qemu-thread-posix.c @ 44bc10d5

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
}