From ef3640f7a7b249a22cc89de60b0f198d341ce971 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 26 Aug 2013 15:25:58 +0200 Subject: ringbuf: Add SMP support --- cpukit/libcsupport/include/ringbuf.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'cpukit/libcsupport/include/ringbuf.h') diff --git a/cpukit/libcsupport/include/ringbuf.h b/cpukit/libcsupport/include/ringbuf.h index 99e72a5bb3..13821a545d 100644 --- a/cpukit/libcsupport/include/ringbuf.h +++ b/cpukit/libcsupport/include/ringbuf.h @@ -10,6 +10,8 @@ #ifndef _RTEMS_RINGBUF_H #define _RTEMS_RINGBUF_H +#include + #ifndef RINGBUF_QUEUE_LENGTH #define RINGBUF_QUEUE_LENGTH 128 #endif @@ -18,6 +20,7 @@ typedef struct { uint8_t buffer[RINGBUF_QUEUE_LENGTH]; volatile int head; volatile int tail; + rtems_interrupt_lock lock; } Ring_buffer_t; #define Ring_buffer_Initialize( _buffer ) \ @@ -33,22 +36,22 @@ typedef struct { #define Ring_buffer_Add_character( _buffer, _ch ) \ do { \ - uint32_t isrlevel; \ + rtems_interrupt_level isrlevel; \ \ - rtems_interrupt_disable( isrlevel ); \ + rtems_interrupt_lock_acquire( &(_buffer)->lock, isrlevel ); \ (_buffer)->tail = ((_buffer)->tail+1) % RINGBUF_QUEUE_LENGTH; \ (_buffer)->buffer[ (_buffer)->tail ] = (_ch); \ - rtems_interrupt_enable( isrlevel ); \ + rtems_interrupt_lock_release( &(_buffer)->lock, isrlevel ); \ } while ( 0 ) #define Ring_buffer_Remove_character( _buffer, _ch ) \ do { \ - uint32_t isrlevel; \ + rtems_interrupt_level isrlevel; \ \ - rtems_interrupt_disable( isrlevel ); \ + rtems_interrupt_lock_acquire( &(_buffer)->lock, isrlevel ); \ (_buffer)->head = ((_buffer)->head+1) % RINGBUF_QUEUE_LENGTH; \ (_ch) = (_buffer)->buffer[ (_buffer)->head ]; \ - rtems_interrupt_enable( isrlevel ); \ + rtems_interrupt_lock_release( &(_buffer)->lock, isrlevel ); \ } while ( 0 ) #endif -- cgit v1.2.3