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