mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
ringbuffer: Make ring buffer access irq-save
We have to temporarily disable nterrupts when performing rinbuffer operations, as the ring buffer is used both from IRQ as well as process context.
This commit is contained in:
@@ -17,6 +17,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define TRACE_LEVEL 6
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//#define TRACE_LEVEL 6
|
||||
|
||||
#include "board.h"
|
||||
#include "req_ctx.h"
|
||||
#include "linuxlist.h"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define TRACE_LEVEL 6
|
||||
|
||||
#include "board.h"
|
||||
#include "simtrace.h"
|
||||
#include "ringbuffer.h"
|
||||
@@ -250,6 +252,9 @@ void mode_cardemu_exit(void)
|
||||
{
|
||||
TRACE_ENTRY();
|
||||
|
||||
/* FIXME: stop tc_fdt */
|
||||
/* FIXME: release all rctx, unlink them from any queue */
|
||||
|
||||
PIO_DisableIt(&pin_usim1_rst);
|
||||
PIO_DisableIt(&pin_usim1_vcc);
|
||||
|
||||
|
||||
@@ -1,16 +1,27 @@
|
||||
#include "ringbuffer.h"
|
||||
#include "trace.h"
|
||||
#include "utils.h"
|
||||
|
||||
void rbuf_reset(volatile ringbuf * rb)
|
||||
{
|
||||
unsigned long state;
|
||||
|
||||
local_irq_save(state);
|
||||
rb->ird = 0;
|
||||
rb->iwr = 0;
|
||||
local_irq_restore(state);
|
||||
}
|
||||
|
||||
uint8_t rbuf_read(volatile ringbuf * rb)
|
||||
{
|
||||
uint8_t val = rb->buf[rb->ird];
|
||||
unsigned long state;
|
||||
uint8_t val;
|
||||
|
||||
local_irq_save(state);
|
||||
val = rb->buf[rb->ird];
|
||||
rb->ird = (rb->ird + 1) % RING_BUFLEN;
|
||||
local_irq_restore(state);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
@@ -19,22 +30,41 @@ uint8_t rbuf_peek(volatile ringbuf * rb)
|
||||
return rb->buf[rb->ird];
|
||||
}
|
||||
|
||||
void rbuf_write(volatile volatile ringbuf * rb, uint8_t item)
|
||||
{
|
||||
if (!rbuf_is_full(rb)) {
|
||||
rb->buf[rb->iwr] = item;
|
||||
rb->iwr = (rb->iwr + 1) % RING_BUFLEN;
|
||||
} else {
|
||||
TRACE_ERROR("Ringbuffer full, losing bytes!");
|
||||
}
|
||||
}
|
||||
|
||||
bool rbuf_is_empty(volatile ringbuf * rb)
|
||||
{
|
||||
return rb->ird == rb->iwr;
|
||||
}
|
||||
|
||||
bool rbuf_is_full(volatile ringbuf * rb)
|
||||
static bool __rbuf_is_full(volatile ringbuf * rb)
|
||||
{
|
||||
return rb->ird == (rb->iwr + 1) % RING_BUFLEN;
|
||||
}
|
||||
|
||||
bool rbuf_is_full(volatile ringbuf * rb)
|
||||
{
|
||||
unsigned long state;
|
||||
bool rc;
|
||||
|
||||
local_irq_save(state);
|
||||
rc = rb->ird == (rb->iwr + 1) % RING_BUFLEN;
|
||||
local_irq_restore(state);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void rbuf_write(volatile volatile ringbuf * rb, uint8_t item)
|
||||
{
|
||||
unsigned long state;
|
||||
|
||||
local_irq_save(state);
|
||||
if (!__rbuf_is_full(rb)) {
|
||||
rb->buf[rb->iwr] = item;
|
||||
rb->iwr = (rb->iwr + 1) % RING_BUFLEN;
|
||||
local_irq_restore(state);
|
||||
} else {
|
||||
local_irq_restore(state);
|
||||
TRACE_ERROR("Ringbuffer full, losing bytes!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user