This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHarald Welte has uploaded this change for review. ( https://gerrit.osmocom.org/9859 Change subject: ringbuffer: Don't print/TRAC from ringbuffer ...................................................................... ringbuffer: Don't print/TRAC from ringbuffer In commit eac1bec4285a48b466e9fd09b0513b3c49d393b3 we start to use the ringbuffer inside the console printing code. As a result, we must not use TRACE_*() or printf() from within ringbuffer.c code to avoid infinite recursion. Instead, let rbuf_write() return a negative return value in case the ring buffer overflows. This way, the callers (outside the console/stdout code) can print an error message themselves. Change-Id: Ib009f013be119dbad22fa2b7d60ec8dee59baee5 --- M firmware/libcommon/include/ringbuffer.h M firmware/libcommon/source/mode_cardemu.c M firmware/libcommon/source/ringbuffer.c 3 files changed, 10 insertions(+), 4 deletions(-) git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/59/9859/1 diff --git a/firmware/libcommon/include/ringbuffer.h b/firmware/libcommon/include/ringbuffer.h index 1d29760..efc557c 100644 --- a/firmware/libcommon/include/ringbuffer.h +++ b/firmware/libcommon/include/ringbuffer.h @@ -16,7 +16,7 @@ void rbuf_reset(volatile ringbuf * rb); uint8_t rbuf_read(volatile ringbuf * rb); uint8_t rbuf_peek(volatile ringbuf * rb); -void rbuf_write(volatile ringbuf * rb, uint8_t item); +int rbuf_write(volatile ringbuf * rb, uint8_t item); bool rbuf_is_empty(volatile ringbuf * rb); bool rbuf_is_full(volatile ringbuf * rb); diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c index 7de67df..2d9af99 100644 --- a/firmware/libcommon/source/mode_cardemu.c +++ b/firmware/libcommon/source/mode_cardemu.c @@ -186,7 +186,8 @@ if (csr & US_CSR_RXRDY) { byte = (usart->US_RHR) & 0xFF; - rbuf_write(&ci->rb, byte); + if (rbuf_write(&ci->rb, byte) < 0) + TRACE_ERROR("rbuf overrun\r\n"); } if (csr & US_CSR_TXRDY) { diff --git a/firmware/libcommon/source/ringbuffer.c b/firmware/libcommon/source/ringbuffer.c index 4d980d7..b8cd5c6 100644 --- a/firmware/libcommon/source/ringbuffer.c +++ b/firmware/libcommon/source/ringbuffer.c @@ -2,6 +2,10 @@ #include "trace.h" #include "utils.h" +/* WARNINGI: Since console output is internally using this ringbuffer to implement + * buffered writes, we cannot use any TRACE_*() or printf() style functions here, + * as it would create infinite recursion! */ + void rbuf_reset(volatile ringbuf * rb) { unsigned long state; @@ -52,7 +56,7 @@ return rc; } -void rbuf_write(volatile ringbuf * rb, uint8_t item) +int rbuf_write(volatile ringbuf * rb, uint8_t item) { unsigned long state; @@ -61,9 +65,10 @@ rb->buf[rb->iwr] = item; rb->iwr = (rb->iwr + 1) % RING_BUFLEN; local_irq_restore(state); + return 0; } else { local_irq_restore(state); - TRACE_ERROR("Ringbuffer full, losing bytes!"); + return -1; } } -- To view, visit https://gerrit.osmocom.org/9859 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: simtrace2 Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: Ib009f013be119dbad22fa2b7d60ec8dee59baee5 Gerrit-Change-Number: 9859 Gerrit-PatchSet: 1 Gerrit-Owner: Harald Welte <laforge at gnumonks.org> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180704/7c6a9fd2/attachment.htm>