-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmessage_queue.c
71 lines (60 loc) · 1.24 KB
/
message_queue.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <string.h>
#include <stdlib.h>
#include "message_queue.h"
typedef struct element {
message_t data;
struct element *next;
}element_t;
struct queue {
element_t *head;
element_t *tail;
int added;
int removed;
};
mqueue_t* init_queue()
{
mqueue_t *mqueue = (mqueue_t*)calloc(1, sizeof(mqueue_t));
if (!mqueue) {
return NULL;
}
mqueue->head = (element_t*)calloc(1, sizeof(element_t));
mqueue->tail = mqueue->head;
if (!mqueue->head) {
return NULL;
}
return mqueue;
}
int add_to_queue(mqueue_t *mqueue, message_t *m)
{
memcpy(&mqueue->tail->data, m, MESSAGE_SIZE);
mqueue->tail->next = (element_t*)calloc(1, sizeof(element_t));
mqueue->tail = mqueue->tail->next;
++(mqueue->added);
if (!mqueue->tail) {
return 1;
}
return 0;
}
int pop_from_queue(mqueue_t *mqueue, message_t *m)
{
if (mqueue->added > mqueue->removed)
{
++(mqueue->removed);
memcpy(m, mqueue->head, MESSAGE_SIZE);
element_t *tmp = mqueue->head;
mqueue->head = mqueue->head->next;
free(tmp);
return 0;
}
return 1;
}
void destroy_queue(mqueue_t *mqueue)
{
while (mqueue->head) {
element_t *tmp = mqueue->head->next;
free(mqueue->head);
mqueue->head = tmp;
}
free(mqueue);
mqueue = NULL;
}