12 #define INIT_MUTEX(mutex) InitializeCriticalSection(mutex)
13 #define INIT_COND(cond) InitializeConditionVariable(cond)
15 #define MUTEX_LOCK(mutex) EnterCriticalSection(mutex)
16 #define MUTEX_UNLOCK(mutex) LeaveCriticalSection(mutex)
17 #define SIGNAL_COND(cond) WakeConditionVariable(cond)
18 #define SIGNAL_WAIT(cond, mutex) SleepConditionVariableCS(cond, mutex, INFINITE)
20 #define INIT_MUTEX(mutex) pthread_mutex_init(mutex, NULL)
21 #define INIT_COND(cond) pthread_cond_init(cond, NULL)
23 #define MUTEX_LOCK(mutex) pthread_mutex_lock(mutex)
24 #define MUTEX_UNLOCK(mutex) pthread_mutex_unlock(mutex)
25 #define SIGNAL_COND(cond) pthread_cond_signal(cond)
26 #define SIGNAL_WAIT(cond, mutex) pthread_cond_wait(cond, mutex)
37 buffer->messages = (
char**) malloc(BUFFER_SIZE *
sizeof(
char*));
38 if (!buffer->messages) {
43 for (
int i = 0; i < BUFFER_SIZE; i++) {
44 buffer->messages[i] = (
char*) malloc(MAX_MSG_LENGTH);
45 if (!buffer->messages[i]) {
47 for (
int j = 0; j < i; j++) {
48 free(buffer->messages[j]);
50 free(buffer->messages);
55 INIT_MUTEX(&buffer->mutex);
56 INIT_COND(&buffer->cond);
62 if (buffer->messages) {
63 for (
int i = 0; i < BUFFER_SIZE; i++) {
64 free(buffer->messages[i]);
66 free(buffer->messages);
70void write_to_ringbuffer(
ring_buffer_t* buffer,
const char* message) {
71 MUTEX_LOCK(&buffer->mutex);
72 if (buffer->count < BUFFER_SIZE) {
73 snprintf(buffer->messages[buffer->tail], MAX_MSG_LENGTH,
"%s", message);
74 buffer->tail = (buffer->tail + 1) % BUFFER_SIZE;
76 SIGNAL_COND(&buffer->cond);
78 MUTEX_UNLOCK(&buffer->mutex);
82int read_from_ringbuffer(
ring_buffer_t* buffer,
char* message) {
83 MUTEX_LOCK(&buffer->mutex);
84 while (buffer->count == 0) {
85 SIGNAL_WAIT(&buffer->cond, &buffer->mutex);
87 snprintf(message, MAX_MSG_LENGTH,
"%s", buffer->messages[buffer->head]);
88 buffer->head = (buffer->head + 1) % BUFFER_SIZE;
90 MUTEX_UNLOCK(&buffer->mutex);