]> git.proxmox.com Git - qemu.git/blame - libcacard/event.c
acpi: add dummy write function for acpi timer
[qemu.git] / libcacard / event.c
CommitLineData
111a38b0
RR
1/*
2 * event queue implementation.
3 *
4 * This code is licensed under the GNU LGPL, version 2.1 or later.
5 * See the COPYING.LIB file in the top-level directory.
6 */
7
8#include "qemu-common.h"
1de7afc9 9#include "qemu/thread.h"
111a38b0
RR
10
11#include "vcard.h"
12#include "vreader.h"
13#include "vevent.h"
14
15VEvent *
16vevent_new(VEventType type, VReader *reader, VCard *card)
17{
18 VEvent *new_vevent;
19
7267c094 20 new_vevent = (VEvent *)g_malloc(sizeof(VEvent));
111a38b0
RR
21 new_vevent->next = NULL;
22 new_vevent->type = type;
23 new_vevent->reader = vreader_reference(reader);
24 new_vevent->card = vcard_reference(card);
25
26 return new_vevent;
27}
28
29void
30vevent_delete(VEvent *vevent)
31{
32 if (vevent == NULL) {
33 return;
34 }
35 vreader_free(vevent->reader);
36 vcard_free(vevent->card);
7267c094 37 g_free(vevent);
111a38b0
RR
38}
39
40/*
41 * VEvent queue management
42 */
43
44static VEvent *vevent_queue_head;
45static VEvent *vevent_queue_tail;
46static QemuMutex vevent_queue_lock;
47static QemuCond vevent_queue_condition;
48
49void vevent_queue_init(void)
50{
51 qemu_mutex_init(&vevent_queue_lock);
52 qemu_cond_init(&vevent_queue_condition);
53 vevent_queue_head = vevent_queue_tail = NULL;
54}
55
56void
57vevent_queue_vevent(VEvent *vevent)
58{
59 vevent->next = NULL;
60 qemu_mutex_lock(&vevent_queue_lock);
61 if (vevent_queue_head) {
62 assert(vevent_queue_tail);
63 vevent_queue_tail->next = vevent;
64 } else {
65 vevent_queue_head = vevent;
66 }
67 vevent_queue_tail = vevent;
68 qemu_cond_signal(&vevent_queue_condition);
69 qemu_mutex_unlock(&vevent_queue_lock);
70}
71
72/* must have lock */
73static VEvent *
74vevent_dequeue_vevent(void)
75{
76 VEvent *vevent = NULL;
77 if (vevent_queue_head) {
78 vevent = vevent_queue_head;
79 vevent_queue_head = vevent->next;
80 vevent->next = NULL;
81 }
82 return vevent;
83}
84
85VEvent *vevent_wait_next_vevent(void)
86{
87 VEvent *vevent;
88
89 qemu_mutex_lock(&vevent_queue_lock);
90 while ((vevent = vevent_dequeue_vevent()) == NULL) {
91 qemu_cond_wait(&vevent_queue_condition, &vevent_queue_lock);
92 }
93 qemu_mutex_unlock(&vevent_queue_lock);
94 return vevent;
95}
96
97VEvent *vevent_get_next_vevent(void)
98{
99 VEvent *vevent;
100
101 qemu_mutex_lock(&vevent_queue_lock);
102 vevent = vevent_dequeue_vevent();
103 qemu_mutex_unlock(&vevent_queue_lock);
104 return vevent;
105}
106