Skip to content

Commit 83279d1

Browse files
Nicolas Pitrekartben
authored andcommitted
ring_buffer: optimize the partial buffer loop
It is more efficient to break early when size of claimed area becomes zero. Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
1 parent 67978f8 commit 83279d1

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

lib/utils/ring_buffer.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,14 @@ uint32_t ring_buf_put(struct ring_buf *buf, const uint8_t *data, uint32_t size)
6363

6464
do {
6565
partial_size = ring_buf_put_claim(buf, &dst, size);
66+
if (partial_size == 0) {
67+
break;
68+
}
6669
memcpy(dst, data, partial_size);
6770
total_size += partial_size;
6871
size -= partial_size;
6972
data += partial_size;
70-
} while (size && partial_size);
73+
} while (size != 0);
7174

7275
err = ring_buf_put_finish(buf, total_size);
7376
__ASSERT_NO_MSG(err == 0);
@@ -130,13 +133,16 @@ uint32_t ring_buf_get(struct ring_buf *buf, uint8_t *data, uint32_t size)
130133

131134
do {
132135
partial_size = ring_buf_get_claim(buf, &src, size);
136+
if (partial_size == 0) {
137+
break;
138+
}
133139
if (data) {
134140
memcpy(data, src, partial_size);
135141
data += partial_size;
136142
}
137143
total_size += partial_size;
138144
size -= partial_size;
139-
} while (size && partial_size);
145+
} while (size != 0);
140146

141147
err = ring_buf_get_finish(buf, total_size);
142148
__ASSERT_NO_MSG(err == 0);
@@ -154,12 +160,15 @@ uint32_t ring_buf_peek(struct ring_buf *buf, uint8_t *data, uint32_t size)
154160

155161
do {
156162
partial_size = ring_buf_get_claim(buf, &src, size);
163+
if (partial_size == 0) {
164+
break;
165+
}
157166
__ASSERT_NO_MSG(data != NULL);
158167
memcpy(data, src, partial_size);
159168
data += partial_size;
160169
total_size += partial_size;
161170
size -= partial_size;
162-
} while (size && partial_size);
171+
} while (size != 0);
163172

164173
/* effectively unclaim total_size bytes */
165174
err = ring_buf_get_finish(buf, 0);
@@ -206,11 +215,14 @@ int ring_buf_item_put(struct ring_buf *buf, uint16_t type, uint8_t value,
206215

207216
do {
208217
partial_size = ring_buf_put_claim(buf, &dst, size);
218+
if (partial_size == 0) {
219+
break;
220+
}
209221
memcpy(dst, data, partial_size);
210222
size -= partial_size;
211223
total_size += partial_size;
212224
data += partial_size;
213-
} while (size && partial_size);
225+
} while (size != 0);
214226
__ASSERT_NO_MSG(size == 0);
215227

216228
err = ring_buf_put_finish(buf, total_size);
@@ -252,13 +264,16 @@ int ring_buf_item_get(struct ring_buf *buf, uint16_t *type, uint8_t *value,
252264

253265
do {
254266
partial_size = ring_buf_get_claim(buf, &src, size);
267+
if (partial_size == 0) {
268+
break;
269+
}
255270
if (data) {
256271
memcpy(data, src, partial_size);
257272
data += partial_size;
258273
}
259274
total_size += partial_size;
260275
size -= partial_size;
261-
} while (size && partial_size);
276+
} while (size != 0);
262277

263278
err = ring_buf_get_finish(buf, total_size);
264279
__ASSERT_NO_MSG(err == 0);

0 commit comments

Comments
 (0)