Lines Matching refs:ring

31 	struct lws_ring *ring = lws_malloc(sizeof(*ring), "ring create");
33 if (!ring)
36 ring->buflen = (uint32_t)(count * element_len);
37 ring->element_len = (uint32_t)element_len;
38 ring->head = 0;
39 ring->oldest_tail = 0;
40 ring->destroy_element = destroy_element;
42 ring->buf = lws_malloc(ring->buflen, "ring buf");
43 if (!ring->buf) {
44 lws_free(ring);
49 return ring;
53 lws_ring_destroy(struct lws_ring *ring)
55 if (ring->destroy_element)
56 while (ring->oldest_tail != ring->head) {
57 ring->destroy_element((uint8_t *)ring->buf +
58 ring->oldest_tail);
59 ring->oldest_tail =
60 (ring->oldest_tail + ring->element_len) %
61 ring->buflen;
63 if (ring->buf)
64 lws_free_set_NULL(ring->buf);
66 lws_free(ring);
70 lws_ring_get_count_free_elements(struct lws_ring *ring)
83 if (ring->head == ring->oldest_tail)
84 f = (int)(ring->buflen - ring->element_len);
86 if (ring->head < ring->oldest_tail)
87 f = (int)((ring->oldest_tail - ring->head) -
88 ring->element_len);
90 f = (int)((ring->buflen - ring->head) + ring->oldest_tail -
91 ring->element_len);
96 return (unsigned int)f / ring->element_len;
100 lws_ring_get_count_waiting_elements(struct lws_ring *ring, uint32_t *tail)
104 tail = &ring->oldest_tail;
114 if (ring->head == *tail)
117 if (ring->head > *tail)
118 f = (int)(ring->head - *tail);
120 f = (int)((ring->buflen - *tail) + ring->head);
122 return (unsigned int)f / ring->element_len;
126 lws_ring_next_linear_insert_range(struct lws_ring *ring, void **start,
132 n = (int)(lws_ring_get_count_free_elements(ring) * ring->element_len);
137 if (ring->head + (unsigned int)n > ring->buflen) {
138 *start = (void *)(((uint8_t *)ring->buf) + ring->head);
139 *bytes = ring->buflen - ring->head;
144 *start = (void *)(((uint8_t *)ring->buf) + ring->head);
151 lws_ring_bump_head(struct lws_ring *ring, size_t bytes)
153 ring->head = (ring->head + (uint32_t)bytes) % ring->buflen;
157 lws_ring_insert(struct lws_ring *ring, const void *src, size_t max_count)
164 n = (int)(lws_ring_get_count_free_elements(ring) * ring->element_len);
167 if ((uint32_t)n > max_count * ring->element_len)
168 n = (int)(max_count * ring->element_len);
174 if (ring->head + (unsigned int)n > ring->buflen) {
181 m = ring->buflen - ring->head;
182 memcpy(((uint8_t *)ring->buf) + ring->head, src, m);
184 ring->head = 0;
192 memcpy(((uint8_t *)ring->buf) + ring->head, src, (size_t)n);
193 ring->head = (ring->head + (unsigned int)n) % ring->buflen;
195 return (unsigned long)(((uint8_t *)src + (unsigned int)n) - osrc) / ring->element_len;
199 lws_ring_consume(struct lws_ring *ring, uint32_t *tail, void *dest,
208 fake_tail = ring->oldest_tail;
213 n = (int)(lws_ring_get_count_waiting_elements(ring, tail) *
214 ring->element_len);
217 if ((size_t)n > max_count * ring->element_len)
218 n = (int)(max_count * ring->element_len);
221 *tail = ((*tail) + (unsigned int)n) % ring->buflen;
223 lws_ring_update_oldest_tail(ring, *tail);
225 return (unsigned int)n / ring->element_len;
227 if (*tail + (unsigned int)n > ring->buflen) {
234 m = (int32_t)(ring->buflen - *tail);
235 memcpy(dest, ((uint8_t *)ring->buf) + *tail, (size_t)m);
245 memcpy(dest, ((uint8_t *)ring->buf) + *tail, (size_t)n);
247 *tail = ((*tail) + (unsigned int)n) % ring->buflen;
249 lws_ring_update_oldest_tail(ring, *tail);
251 return (unsigned int)(((uint8_t *)dest + n) - odest) / (unsigned int)ring->element_len;
255 lws_ring_get_element(struct lws_ring *ring, uint32_t *tail)
258 tail = &ring->oldest_tail;
260 if (*tail == ring->head)
263 return ((uint8_t *)ring->buf) + *tail;
267 lws_ring_update_oldest_tail(struct lws_ring *ring, uint32_t tail)
269 if (!ring->destroy_element) {
270 ring->oldest_tail = tail;
274 while (ring->oldest_tail != tail) {
275 ring->destroy_element((uint8_t *)ring->buf + ring->oldest_tail);
276 ring->oldest_tail = (ring->oldest_tail + ring->element_len) %
277 ring->buflen;
282 lws_ring_get_oldest_tail(struct lws_ring *ring)
284 return ring->oldest_tail;
288 lws_ring_dump(struct lws_ring *ring, uint32_t *tail)
291 tail = &ring->oldest_tail;
292 lwsl_notice("ring %p: buflen %u, elem_len %u, head %u, oldest_tail %u\n"
294 ring, (int)ring->buflen, (int)ring->element_len,
295 (int)ring->head, (int)ring->oldest_tail,
296 (int)lws_ring_get_count_free_elements(ring), (int)*tail,
297 (int)lws_ring_get_count_waiting_elements(ring, tail));