My Project
event.c
Go to the documentation of this file.
1
11#include "event.h"
12#include "util.h"
13#include "options.h"
14
15#include <stdlib.h>
16
17
23void event_init(Event *event)
24{
25 int i;
26
27 event->size = 4;
28 event->first = 0;
29 event->end = 0;
30 event->ring = (char**) malloc(event->size * sizeof (char*));
31 if (event->ring == NULL) fatal_error("cannot allocate event buffers\n");
32 for (i = 0; i < event->size; ++i) event->ring[i] = NULL;
33 spin_init(event);
34 lock_init(event);
35 condition_init(event);
36
37 event->loop = true;
38}
39
46{
47 int i;
48
49 spin_lock(event);
50
51 for (i = 0; i < event->size; ++i) {
52 free(event->ring[i]);
53 event->ring[i] = NULL;
54 }
55 event->first = 0;
56 event->end = 0;
57
58 spin_unlock(event);
59}
60
61
67void event_free(Event *event)
68{
69 int i;
70
71 spin_lock(event);
72
73 for (i = 0; i < event->size; ++i) {
74 free(event->ring[i]);
75 }
76 event->first = 0;
77 event->end = 0;
78 free(event->ring);
79
80 lock_free(event);
81 condition_free(event);
82
83 spin_unlock(event);
84 spin_free(event);
85}
86
93void event_add_message(Event *event, char *message)
94{
95 char **new_ring;
96 int new_size, i;
97 int last;
98
99 spin_lock(event);
100
101 last = event->end;
102 event->end = (event->end + 1) % event->size;
103
104 if (event->end == event->first) {
105 new_size = event->size * 2;
106 new_ring = (char**) malloc(new_size * sizeof (char*));
107 if (new_ring == NULL) fatal_error("cannot allocate event buffers\n");
108 for (i = 0; i < event->size; ++i)
109 new_ring[i] = event->ring[(i + event->first) % event->size];
110 for (; i < new_size; ++i) new_ring[i] = NULL;
111 event->first = 0;
112 event->end = event->size;
113 last = event->size - 1;
114 event->size = new_size;
115 free(event->ring);
116 event->ring = new_ring;
117 }
118
119 event->ring[last] = message;
120 info("<event add [%d]: %s>\n", last, message);
121
122 spin_unlock(event);
123}
124
125
133void event_wait(Event *event, char **cmd, char **param)
134{
135 int n;
136 char *message;
137
138 lock(event);
139 while ((message = event_peek_message(event)) == NULL) {
140 condition_wait(event);
141 }
142 unlock(event);
143
144 free(*cmd);
145 free(*param);
146
147 info("<event wait: %s>\n", message);
148
149 n = strlen(message);
150 *cmd = (char*) malloc(n + 1);
151 *param = (char*) malloc(n + 1);
152 parse_command(message, *cmd, *param, n);
153 free(message);
154}
155
157{
158 char *message;
159 puts("Press [Enter] to continue");
160 lock(event);
161 while ((message = event_peek_message(event)) == NULL) {
162 condition_wait(event);
163 }
164 unlock(event);
165 free(message);
166}
167
176bool event_exist(Event *event)
177{
178 return (event->first != event->end);
179}
180
188{
189 char *message;
190
191 spin_lock(event);
192
193 if (event_exist(event)) {
194 message = event->ring[event->first];
195 event->ring[event->first] = NULL;
196 event->first = (event->first + 1) % event->size;
197 } else {
198 message = NULL;
199 }
200
201 spin_unlock(event);
202
203 return message;
204}
205
void event_clear_messages(Event *event)
Remove all unprocessed messages.
Definition event.c:45
bool event_exist(Event *event)
Check if there is a message.
Definition event.c:176
void event_init(Event *event)
Initialize a message event.
Definition event.c:23
void event_wait_enter(Event *event)
Definition event.c:156
void event_wait(Event *event, char **cmd, char **param)
Wait input.
Definition event.c:133
void event_free(Event *event)
Free a message event.
Definition event.c:67
void event_add_message(Event *event, char *message)
Add a new message at the bottom of the list.
Definition event.c:93
char * event_peek_message(Event *event)
Peek the first message from the list.
Definition event.c:187
Definition event.h:18
int size
Definition event.h:21
char ** ring
Definition event.h:20
int first
Definition event.h:22
int end
Definition event.h:23
char * parse_command(const char *string, char *cmd, char *param, const unsigned int size)
Parse a command.
Definition util.c:867
Miscellaneous utilities header.
#define fatal_error(...)
Display an error message as "FATAL_ERROR : file name : function name : line number : ....
Definition util.h:349
#define info(...)
Display a message.
Definition util.h:382