#define UART_IIR_TYPE_BITS 0xc0
struct serial8250_device {
- pthread_mutex_t mutex;
+ struct mutex mutex;
u8 id;
u16 iobase;
static struct serial8250_device devices[] = {
/* ttyS0 */
[0] = {
- .mutex = PTHREAD_MUTEX_INITIALIZER,
+ .mutex = MUTEX_INITIALIZER,
.id = 0,
.iobase = 0x3f8,
},
/* ttyS1 */
[1] = {
- .mutex = PTHREAD_MUTEX_INITIALIZER,
+ .mutex = MUTEX_INITIALIZER,
.id = 1,
.iobase = 0x2f8,
},
/* ttyS2 */
[2] = {
- .mutex = PTHREAD_MUTEX_INITIALIZER,
+ .mutex = MUTEX_INITIALIZER,
.id = 2,
.iobase = 0x3e8,
},
/* ttyS3 */
[3] = {
- .mutex = PTHREAD_MUTEX_INITIALIZER,
+ .mutex = MUTEX_INITIALIZER,
.id = 3,
.iobase = 0x2e8,
* to write user-space code! :-)
*/
-#define DEFINE_MUTEX(mutex) pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
+struct mutex {
+ pthread_mutex_t mutex;
+};
+#define MUTEX_INITIALIZER (struct mutex) { .mutex = PTHREAD_MUTEX_INITIALIZER }
-static inline void mutex_init(pthread_mutex_t *mutex)
+#define DEFINE_MUTEX(mtx) struct mutex mtx = MUTEX_INITIALIZER
+
+static inline void mutex_init(struct mutex *lock)
{
- if (pthread_mutex_init(mutex, NULL) != 0)
+ if (pthread_mutex_init(&lock->mutex, NULL) != 0)
die("unexpected pthread_mutex_init() failure!");
}
-static inline void mutex_lock(pthread_mutex_t *mutex)
+static inline void mutex_lock(struct mutex *lock)
{
- if (pthread_mutex_lock(mutex) != 0)
+ if (pthread_mutex_lock(&lock->mutex) != 0)
die("unexpected pthread_mutex_lock() failure!");
+
}
-static inline void mutex_unlock(pthread_mutex_t *mutex)
+static inline void mutex_unlock(struct mutex *lock)
{
- if (pthread_mutex_unlock(mutex) != 0)
+ if (pthread_mutex_unlock(&lock->mutex) != 0)
die("unexpected pthread_mutex_unlock() failure!");
}
};
struct qcow {
- pthread_mutex_t mutex;
+ struct mutex mutex;
struct qcow_header *header;
struct qcow_l1_table table;
struct qcow_refcount_table refcount_table;
void *data;
int signalcount;
- pthread_mutex_t mutex;
+ struct mutex mutex;
struct list_head queue;
};
.kvm = kvm,
.callback = callback,
.data = data,
- .mutex = PTHREAD_MUTEX_INITIALIZER,
+ .mutex = MUTEX_INITIALIZER,
};
}
struct uip_info {
struct list_head udp_socket_head;
struct list_head tcp_socket_head;
- pthread_mutex_t udp_socket_lock;
- pthread_mutex_t tcp_socket_lock;
+ struct mutex udp_socket_lock;
+ struct mutex tcp_socket_lock;
struct uip_eth_addr guest_mac;
struct uip_eth_addr host_mac;
pthread_cond_t buf_free_cond;
pthread_cond_t buf_used_cond;
struct list_head buf_head;
- pthread_mutex_t buf_lock;
+ struct mutex buf_lock;
pthread_t udp_thread;
int udp_epollfd;
int buf_free_nr;
struct uip_udp_socket {
struct sockaddr_in addr;
struct list_head list;
- pthread_mutex_t *lock;
+ struct mutex *lock;
u32 dport, sport;
u32 dip, sip;
int fd;
struct list_head list;
struct uip_info *info;
pthread_cond_t cond;
- pthread_mutex_t *lock;
+ struct mutex *lock;
pthread_t thread;
u32 dport, sport;
u32 guest_acked;
mutex_lock(&info->buf_lock);
while (!(info->buf_used_nr > 0))
- pthread_cond_wait(&info->buf_used_cond, &info->buf_lock);
+ pthread_cond_wait(&info->buf_used_cond, &info->buf_lock.mutex);
list_for_each_entry(buf, &info->buf_head, list) {
if (buf->status == UIP_BUF_STATUS_USED) {
mutex_lock(&info->buf_lock);
while (!(info->buf_free_nr > 0))
- pthread_cond_wait(&info->buf_free_cond, &info->buf_lock);
+ pthread_cond_wait(&info->buf_free_cond, &info->buf_lock.mutex);
list_for_each_entry(buf, &info->buf_head, list) {
if (buf->status == UIP_BUF_STATUS_FREE) {
INIT_LIST_HEAD(tcp_socket_head);
INIT_LIST_HEAD(buf_head);
- pthread_mutex_init(&info->udp_socket_lock, NULL);
- pthread_mutex_init(&info->tcp_socket_lock, NULL);
- pthread_mutex_init(&info->buf_lock, NULL);
+ mutex_init(&info->udp_socket_lock);
+ mutex_init(&info->tcp_socket_lock);
+ mutex_init(&info->buf_lock);
pthread_cond_init(&info->buf_used_cond, NULL);
pthread_cond_init(&info->buf_free_cond, NULL);
static struct uip_tcp_socket *uip_tcp_socket_find(struct uip_tx_arg *arg, u32 sip, u32 dip, u16 sport, u16 dport)
{
struct list_head *sk_head;
- pthread_mutex_t *sk_lock;
+ struct mutex *sk_lock;
struct uip_tcp_socket *sk;
sk_head = &arg->info->tcp_socket_head;
{
struct list_head *sk_head;
struct uip_tcp_socket *sk;
- pthread_mutex_t *sk_lock;
+ struct mutex *sk_lock;
struct uip_tcp *tcp;
struct uip_ip *ip;
int ret;
while (left > 0) {
mutex_lock(sk->lock);
while ((len = sk->guest_acked + sk->window_size - sk->seq_server) <= 0)
- pthread_cond_wait(&sk->cond, sk->lock);
+ pthread_cond_wait(&sk->cond, &sk->lock->mutex);
mutex_unlock(sk->lock);
sk->payload = pos;
{
struct list_head *sk_head;
struct uip_udp_socket *sk;
- pthread_mutex_t *sk_lock;
+ struct mutex *sk_lock;
struct epoll_event ev;
int flags;
int ret;
#include <pthread.h>
#include <stdbool.h>
-static pthread_mutex_t job_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t job_cond = PTHREAD_COND_INITIALIZER;
+static DEFINE_MUTEX(job_mutex);
+static DEFINE_MUTEX(thread_mutex);
+static pthread_cond_t job_cond = PTHREAD_COND_INITIALIZER;
static LIST_HEAD(head);
mutex_lock(&job_mutex);
while (running && (curjob = thread_pool__job_pop_locked()) == NULL)
- pthread_cond_wait(&job_cond, &job_mutex);
+ pthread_cond_wait(&job_cond, &job_mutex.mutex);
mutex_unlock(&job_mutex);
if (running)
};
struct blk_dev {
- pthread_mutex_t mutex;
+ struct mutex mutex;
struct list_head list;
return -ENOMEM;
*bdev = (struct blk_dev) {
- .mutex = PTHREAD_MUTEX_INITIALIZER,
+ .mutex = MUTEX_INITIALIZER,
.disk = disk,
.blk_config = (struct virtio_blk_config) {
.capacity = disk->size / SECTOR_SIZE,
#define VIRTIO_CONSOLE_TX_QUEUE 1
struct con_dev {
- pthread_mutex_t mutex;
+ struct mutex mutex;
struct virtio_device vdev;
struct virt_queue vqs[VIRTIO_CONSOLE_NUM_QUEUES];
};
static struct con_dev cdev = {
- .mutex = PTHREAD_MUTEX_INITIALIZER,
+ .mutex = MUTEX_INITIALIZER,
.config = {
.cols = 80,
};
struct net_dev {
- pthread_mutex_t mutex;
+ struct mutex mutex;
struct virtio_device vdev;
struct list_head list;
u32 features;
pthread_t io_rx_thread;
- pthread_mutex_t io_rx_lock;
+ struct mutex io_rx_lock;
pthread_cond_t io_rx_cond;
pthread_t io_tx_thread;
- pthread_mutex_t io_tx_lock;
+ struct mutex io_tx_lock;
pthread_cond_t io_tx_cond;
int vhost_fd;
while (1) {
mutex_lock(&ndev->io_rx_lock);
if (!virt_queue__available(vq))
- pthread_cond_wait(&ndev->io_rx_cond, &ndev->io_rx_lock);
+ pthread_cond_wait(&ndev->io_rx_cond, &ndev->io_rx_lock.mutex);
mutex_unlock(&ndev->io_rx_lock);
while (virt_queue__available(vq)) {
while (1) {
mutex_lock(&ndev->io_tx_lock);
if (!virt_queue__available(vq))
- pthread_cond_wait(&ndev->io_tx_cond, &ndev->io_tx_lock);
+ pthread_cond_wait(&ndev->io_tx_cond, &ndev->io_tx_lock.mutex);
mutex_unlock(&ndev->io_tx_lock);
while (virt_queue__available(vq)) {
static void virtio_net__io_thread_init(struct kvm *kvm, struct net_dev *ndev)
{
- pthread_mutex_init(&ndev->io_tx_lock, NULL);
- pthread_mutex_init(&ndev->io_rx_lock, NULL);
+ mutex_init(&ndev->io_tx_lock);
+ mutex_init(&ndev->io_rx_lock);
pthread_cond_init(&ndev->io_tx_cond, NULL);
pthread_cond_init(&ndev->io_rx_cond, NULL);