Statistics
| Branch: | Revision:

root / libcacard / event.c @ 92f562ec

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 111a38b0 Robert Relyea
#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
}