Branch data Line data Source code
1 : : /* 2 : : * event queue implementation. 3 : : * 4 : : * This code is licensed under the GNU LGPL, version 2.1 or later. 5 : : * See the COPYING file in the top-level directory. 6 : : */ 7 : : 8 : : #include <glib.h> 9 : : 10 : : #include "vcard.h" 11 : : #include "vreader.h" 12 : : #include "vevent.h" 13 : : 14 : : VEvent * 15 : 24 : vevent_new(VEventType type, VReader *reader, VCard *card) 16 : : { 17 : : VEvent *new_vevent; 18 : : 19 : 24 : new_vevent = g_new(VEvent, 1); 20 : 24 : new_vevent->next = NULL; 21 : 24 : new_vevent->type = type; 22 : 24 : new_vevent->reader = vreader_reference(reader); 23 : 24 : new_vevent->card = vcard_reference(card); 24 : : 25 : 24 : return new_vevent; 26 : : } 27 : : 28 : : void 29 : 22 : vevent_delete(VEvent *vevent) 30 : : { 31 [ + - ]: 22 : if (vevent == NULL) { 32 : : return; 33 : : } 34 : 22 : vreader_free(vevent->reader); 35 : 22 : vcard_free(vevent->card); 36 : 22 : g_free(vevent); 37 : : } 38 : : 39 : : /* 40 : : * VEvent queue management 41 : : */ 42 : : 43 : : static VEvent *vevent_queue_head; 44 : : static VEvent *vevent_queue_tail; 45 : : static GMutex vevent_queue_lock; 46 : : static GCond vevent_queue_condition; 47 : : 48 : 6 : void vevent_queue_init(void) 49 : : { 50 : 6 : vevent_queue_head = vevent_queue_tail = NULL; 51 : 6 : } 52 : : 53 : : void 54 : 24 : vevent_queue_vevent(VEvent *vevent) 55 : : { 56 : 24 : vevent->next = NULL; 57 : 24 : g_mutex_lock(&vevent_queue_lock); 58 [ + + ]: 24 : if (vevent_queue_head) { 59 [ - + ]: 6 : assert(vevent_queue_tail); 60 : 6 : vevent_queue_tail->next = vevent; 61 : : } else { 62 : 18 : vevent_queue_head = vevent; 63 : : } 64 : 24 : vevent_queue_tail = vevent; 65 : 24 : g_cond_signal(&vevent_queue_condition); 66 : 24 : g_mutex_unlock(&vevent_queue_lock); 67 : 24 : } 68 : : 69 : : /* must have lock */ 70 : : static VEvent * 71 : : vevent_dequeue_vevent(void) 72 : : { 73 : : VEvent *vevent = NULL; 74 [ - - + + ]: 38 : if (vevent_queue_head) { 75 : : vevent = vevent_queue_head; 76 : 22 : vevent_queue_head = vevent->next; 77 : 0 : vevent->next = NULL; 78 : : } 79 : : return vevent; 80 : : } 81 : : 82 : 22 : VEvent *vevent_wait_next_vevent(void) 83 : : { 84 : : VEvent *vevent; 85 : : 86 : 22 : g_mutex_lock(&vevent_queue_lock); 87 : 22 : while ((vevent = vevent_dequeue_vevent()) == NULL) { 88 : 16 : g_cond_wait(&vevent_queue_condition, &vevent_queue_lock); 89 : : } 90 : 22 : g_mutex_unlock(&vevent_queue_lock); 91 : 22 : return vevent; 92 : : } 93 : : 94 : 0 : VEvent *vevent_get_next_vevent(void) 95 : : { 96 : : VEvent *vevent; 97 : : 98 : 0 : g_mutex_lock(&vevent_queue_lock); 99 : : vevent = vevent_dequeue_vevent(); 100 : 0 : g_mutex_unlock(&vevent_queue_lock); 101 : 0 : return vevent; 102 : : } 103 : :