forked from gnbdev/opengnb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgnb_ring_buffer.c
153 lines (88 loc) · 2.97 KB
/
gnb_ring_buffer.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdlib.h>
#include <string.h>
#include "gnb_ring_buffer.h"
gnb_ring_buffer_t *gnb_ring_buffer_init(size_t num, size_t block_size) {
gnb_ring_buffer_t *ring_buffer = (gnb_ring_buffer_t *)malloc(sizeof(gnb_ring_buffer_t));
ring_buffer->num = num;
ring_buffer->block_size = block_size;
ring_buffer->nodes = malloc( sizeof(gnb_ring_node_t *) * num);
int i = 0;
for (i=0;i<ring_buffer->num;i++) {
ring_buffer->nodes[i] = malloc( sizeof(gnb_ring_node_t) );
ring_buffer->nodes[i]->data = malloc(block_size);
}
ring_buffer->head_idx = 0;
ring_buffer->tail_idx = 0;
return ring_buffer;
}
void gnb_ring_buffer_release(gnb_ring_buffer_t *ring_buffer){
int i=0;
void *p;
for (i=0;i<ring_buffer->num;i++){
free(ring_buffer->nodes[i]->data);
free(ring_buffer->nodes[i]);
}
free(ring_buffer->nodes);
free(ring_buffer);
}
int gnb_ring_buffer_copy_in(gnb_ring_buffer_t *ring_buffer, void *data, size_t size){
if ( size > ring_buffer->block_size ){
return GNB_RING_BUFFER_BLOCK_NOT_ENOUGH;
}
int tail_next_idx = ring_buffer->tail_idx + 1;
if ( tail_next_idx >= ring_buffer->num ){
tail_next_idx = 0;
}
if ( tail_next_idx == ring_buffer->head_idx ){
return GNB_RING_BUFFER_FULL;
}
memcpy(ring_buffer->nodes[ring_buffer->tail_idx]->data , data, size);
ring_buffer->nodes[ring_buffer->tail_idx]->size = size;
ring_buffer->tail_idx = tail_next_idx;
return 0;
}
int gnb_ring_buffer_copy_out(gnb_ring_buffer_t *ring_buffer, void *data, size_t *size){
if ( *size > ring_buffer->block_size ){
return GNB_RING_BUFFER_BLOCK_NOT_ENOUGH;
}
if ( ring_buffer->head_idx == ring_buffer->tail_idx ){
return GNB_RING_BUFFER_EMPTY;
}
int head_next_idx = ring_buffer->head_idx + 1;
if ( head_next_idx >= ring_buffer->num ){
head_next_idx = 0;
}
memcpy(data, ring_buffer->nodes[ring_buffer->head_idx]->data, ring_buffer->nodes[ring_buffer->head_idx]->size);
ring_buffer->head_idx = head_next_idx;
return 0;
}
gnb_ring_node_t *gnb_ring_buffer_push(gnb_ring_buffer_t *ring_buffer){
int tail_next_idx = ring_buffer->tail_idx + 1;
if ( tail_next_idx >= ring_buffer->num ){
tail_next_idx = 0;
}
if ( tail_next_idx == ring_buffer->head_idx ){
return NULL;
}
return ring_buffer->nodes[ring_buffer->tail_idx];
}
void gnb_ring_buffer_push_submit(gnb_ring_buffer_t *ring_buffer){
int tail_next_idx = ring_buffer->tail_idx + 1;
if ( tail_next_idx >= ring_buffer->num ){
tail_next_idx = 0;
}
ring_buffer->tail_idx = tail_next_idx;
}
gnb_ring_node_t *gnb_ring_buffer_pop(gnb_ring_buffer_t *ring_buffer){
if ( ring_buffer->head_idx == ring_buffer->tail_idx ){
return NULL;
}
return ring_buffer->nodes[ring_buffer->head_idx];
}
void gnb_ring_buffer_pop_submit(gnb_ring_buffer_t *ring_buffer){
int head_next_idx = ring_buffer->head_idx + 1;
if ( head_next_idx >= ring_buffer->num ){
head_next_idx = 0;
}
ring_buffer->head_idx = head_next_idx;
}