[rtems commit] pipe: Use self-contained mutex
Sebastian Huber
sebh at rtems.org
Fri Feb 2 14:23:15 UTC 2018
Module: rtems
Branch: master
Commit: 8ddd92d56ae7c30f086f69c8e2930b44c5a44f1c
Changeset: http://git.rtems.org/rtems/commit/?id=8ddd92d56ae7c30f086f69c8e2930b44c5a44f1c
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Thu Dec 14 06:12:59 2017 +0100
pipe: Use self-contained mutex
Update #2843.
---
cpukit/include/rtems/confdefs.h | 15 +-----
cpukit/include/rtems/pipe.h | 3 +-
cpukit/libfs/src/pipe/fifo.c | 106 +++++++------------------------------
testsuites/sptests/spfifo02/init.c | 50 -----------------
4 files changed, 22 insertions(+), 152 deletions(-)
diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h
index 212b46c..0d00726 100755
--- a/cpukit/include/rtems/confdefs.h
+++ b/cpukit/include/rtems/confdefs.h
@@ -227,17 +227,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
#define _CONFIGURE_BARRIERS_FOR_FIFOS 0
#endif
-/*
- * This specifies the number of semaphores required for the configured
- * number of FIFOs and named pipes.
- */
-#if CONFIGURE_MAXIMUM_FIFOS > 0 || CONFIGURE_MAXIMUM_PIPES > 0
- #define _CONFIGURE_SEMAPHORES_FOR_FIFOS \
- (1 + (CONFIGURE_MAXIMUM_FIFOS + CONFIGURE_MAXIMUM_PIPES))
-#else
- #define _CONFIGURE_SEMAPHORES_FOR_FIFOS 0
-#endif
-
/**
* @defgroup ConfigFilesystems Filesystems and Mount Table Configuration
*
@@ -445,9 +434,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
* This computes the number of semaphores required for the various
* file systems including the FIFO plugin to the IMFS.
*/
-#define _CONFIGURE_SEMAPHORES_FOR_FILE_SYSTEMS \
- (_CONFIGURE_SEMAPHORES_FOR_FIFOS + \
- _CONFIGURE_SEMAPHORES_FOR_NFS)
+#define _CONFIGURE_SEMAPHORES_FOR_FILE_SYSTEMS _CONFIGURE_SEMAPHORES_FOR_NFS
#ifdef CONFIGURE_INIT
diff --git a/cpukit/include/rtems/pipe.h b/cpukit/include/rtems/pipe.h
index 7c6566a..a2df29c 100644
--- a/cpukit/include/rtems/pipe.h
+++ b/cpukit/include/rtems/pipe.h
@@ -19,6 +19,7 @@
#define _RTEMS_PIPE_H
#include <rtems/libio.h>
+#include <rtems/thread.h>
/**
* @defgroup FIFO_PIPE FIFO/Pipe File System Support
@@ -45,7 +46,7 @@ typedef struct pipe_control {
unsigned int waitingWriters;
unsigned int readerCounter; /* incremental counters */
unsigned int writerCounter; /* for differentiation of successive opens */
- rtems_id Semaphore;
+ rtems_mutex Mutex;
rtems_id readBarrier; /* wait queues */
rtems_id writeBarrier;
#if 0
diff --git a/cpukit/libfs/src/pipe/fifo.c b/cpukit/libfs/src/pipe/fifo.c
index 4743bd0..d664adf 100644
--- a/cpukit/libfs/src/pipe/fifo.c
+++ b/cpukit/libfs/src/pipe/fifo.c
@@ -33,7 +33,7 @@
#define LIBIO_ACCMODE(_iop) (rtems_libio_iop_flags(_iop) & LIBIO_FLAGS_READ_WRITE)
#define LIBIO_NODELAY(_iop) rtems_libio_iop_is_no_delay(_iop)
-static rtems_id pipe_semaphore = RTEMS_ID_NONE;
+static rtems_mutex pipe_mutex = RTEMS_MUTEX_INITIALIZER("Pipes");
#define PIPE_EMPTY(_pipe) (_pipe->Length == 0)
@@ -41,11 +41,9 @@ static rtems_id pipe_semaphore = RTEMS_ID_NONE;
#define PIPE_SPACE(_pipe) (_pipe->Size - _pipe->Length)
#define PIPE_WSTART(_pipe) ((_pipe->Start + _pipe->Length) % _pipe->Size)
-#define PIPE_LOCK(_pipe) \
- ( rtems_semaphore_obtain(_pipe->Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT) \
- == RTEMS_SUCCESSFUL )
+#define PIPE_LOCK(_pipe) rtems_mutex_lock(&(_pipe)->Mutex)
-#define PIPE_UNLOCK(_pipe) rtems_semaphore_release(_pipe->Semaphore)
+#define PIPE_UNLOCK(_pipe) rtems_mutex_unlock(&(_pipe)->Mutex)
#define PIPE_READWAIT(_pipe) \
( rtems_barrier_wait(_pipe->readBarrier, RTEMS_NO_TIMEOUT) \
@@ -95,18 +93,13 @@ static int pipe_alloc(
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
- if (rtems_semaphore_create(
- rtems_build_name ('P', 'I', 's', c), 1,
- RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
- 0, &pipe->Semaphore) != RTEMS_SUCCESSFUL)
- goto err_sem;
+ rtems_mutex_init(&pipe->Mutex, "Pipe");
*pipep = pipe;
if (c ++ == 'z')
c = 'a';
return 0;
-err_sem:
rtems_barrier_delete(pipe->writeBarrier);
err_wbar:
rtems_barrier_delete(pipe->readBarrier);
@@ -124,55 +117,19 @@ static inline void pipe_free(
{
rtems_barrier_delete(pipe->readBarrier);
rtems_barrier_delete(pipe->writeBarrier);
- rtems_semaphore_delete(pipe->Semaphore);
+ rtems_mutex_destroy(&pipe->Mutex);
free(pipe->Buffer);
free(pipe);
}
-static int pipe_lock(void)
+static void pipe_lock(void)
{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- if (pipe_semaphore == RTEMS_ID_NONE) {
- rtems_libio_lock();
-
- if (pipe_semaphore == RTEMS_ID_NONE) {
- sc = rtems_semaphore_create(
- rtems_build_name('P', 'I', 'P', 'E'),
- 1,
- RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
- RTEMS_NO_PRIORITY,
- &pipe_semaphore
- );
- }
-
- rtems_libio_unlock();
- }
-
- if (sc == RTEMS_SUCCESSFUL) {
- sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
- }
-
- if (sc == RTEMS_SUCCESSFUL) {
- return 0;
- } else {
- return -ENOMEM;
- }
+ rtems_mutex_lock(&pipe_mutex);
}
static void pipe_unlock(void)
{
-#ifdef RTEMS_DEBUG
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- sc =
-#endif
- rtems_semaphore_release(pipe_semaphore);
- #ifdef RTEMS_DEBUG
- if (sc != RTEMS_SUCCESSFUL) {
- rtems_fatal_error_occurred(0xdeadbeef);
- }
- #endif
+ rtems_mutex_unlock(&pipe_mutex);
}
/*
@@ -188,9 +145,7 @@ static int pipe_new(
int err = 0;
_Assert( pipep );
- err = pipe_lock();
- if (err)
- return err;
+ pipe_lock();
pipe = *pipep;
if (pipe == NULL) {
@@ -199,8 +154,7 @@ static int pipe_new(
goto out;
}
- if (!PIPE_LOCK(pipe))
- err = -EINTR;
+ PIPE_LOCK(pipe);
if (*pipep == NULL) {
if (err)
@@ -222,15 +176,8 @@ void pipe_release(
pipe_control_t *pipe = *pipep;
uint32_t mode;
- #if defined(RTEMS_DEBUG)
- /* WARN pipe not freed and pipep not set to NULL! */
- if (pipe_lock())
- rtems_fatal_error_occurred(0xdeadbeef);
-
- /* WARN pipe not released! */
- if (!PIPE_LOCK(pipe))
- rtems_fatal_error_occurred(0xdeadbeef);
- #endif
+ pipe_lock();
+ PIPE_LOCK(pipe);
mode = LIBIO_ACCMODE(iop);
if (mode & LIBIO_FLAGS_READ)
@@ -303,8 +250,7 @@ int fifo_open(
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
goto out_error;
- if (! PIPE_LOCK(pipe))
- goto out_error;
+ PIPE_LOCK(pipe);
} while (prevCounter == pipe->writerCounter);
}
break;
@@ -328,8 +274,7 @@ int fifo_open(
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
goto out_error;
- if (! PIPE_LOCK(pipe))
- goto out_error;
+ PIPE_LOCK(pipe);
} while (prevCounter == pipe->readerCounter);
}
break;
@@ -361,8 +306,7 @@ ssize_t pipe_read(
{
int chunk, chunk1, read = 0, ret = 0;
- if (! PIPE_LOCK(pipe))
- return -EINTR;
+ PIPE_LOCK(pipe);
while (PIPE_EMPTY(pipe)) {
/* Not an error */
@@ -379,11 +323,7 @@ ssize_t pipe_read(
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
ret = -EINTR;
- if (! PIPE_LOCK(pipe)) {
- /* WARN waitingReaders not restored! */
- ret = -EINTR;
- goto out_nolock;
- }
+ PIPE_LOCK(pipe);
pipe->waitingReaders --;
if (ret != 0)
goto out_locked;
@@ -413,7 +353,6 @@ ssize_t pipe_read(
out_locked:
PIPE_UNLOCK(pipe);
-out_nolock:
if (read > 0)
return read;
return ret;
@@ -432,8 +371,7 @@ ssize_t pipe_write(
if (count == 0)
return 0;
- if (! PIPE_LOCK(pipe))
- return -EINTR;
+ PIPE_LOCK(pipe);
if (pipe->Readers == 0) {
ret = -EPIPE;
@@ -455,11 +393,7 @@ ssize_t pipe_write(
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
- if (! PIPE_LOCK(pipe)) {
- /* WARN waitingWriters not restored! */
- ret = -EINTR;
- goto out_nolock;
- }
+ PIPE_LOCK(pipe);
pipe->waitingWriters --;
if (ret != 0)
goto out_locked;
@@ -490,7 +424,6 @@ ssize_t pipe_write(
out_locked:
PIPE_UNLOCK(pipe);
-out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
@@ -513,8 +446,7 @@ int pipe_ioctl(
if (buffer == NULL)
return -EFAULT;
- if (! PIPE_LOCK(pipe))
- return -EINTR;
+ PIPE_LOCK(pipe);
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
diff --git a/testsuites/sptests/spfifo02/init.c b/testsuites/sptests/spfifo02/init.c
index a1cb2a3..4fca304 100644
--- a/testsuites/sptests/spfifo02/init.c
+++ b/testsuites/sptests/spfifo02/init.c
@@ -26,9 +26,7 @@ const char rtems_test_name[] = "SPFIFO 2";
/* forward declarations to avoid warnings */
rtems_task Init(rtems_task_argument argument);
void create_all_barriers(void);
-void create_all_semaphores(void);
void delete_barrier(void);
-void delete_semaphore(void);
void create_fifo(void);
void open_fifo(int expected, int flags);
@@ -66,31 +64,6 @@ void create_all_barriers(void)
}
}
-void create_all_semaphores(void)
-{
- rtems_status_code status;
- int i;
-
- SemaphoreCount = 0;
-
- for ( i=0 ; i<MAXIMUM ; i++ ) {
- status = rtems_semaphore_create(
- rtems_build_name( 'S', 'E', 'M', 0x30+i ),
- 0,
- RTEMS_DEFAULT_ATTRIBUTES,
- 0,
- &Semaphores[i]
- );
- if ( status == RTEMS_TOO_MANY ) {
- printf( "%d Semaphores created\n", SemaphoreCount+1 );
- return;
- }
-
- directive_failed( status, "semaphore create" );
- SemaphoreCount++;
- }
-}
-
void delete_barrier(void)
{
rtems_status_code status;
@@ -102,17 +75,6 @@ void delete_barrier(void)
directive_failed( status, "barrier delete" );
}
-void delete_semaphore(void)
-{
- rtems_status_code status;
-
- SemaphoreCount--;
- printf( "Deleting semaphore id=0x%08x\n",
- (unsigned int) Semaphores[SemaphoreCount] );
- status = rtems_semaphore_delete( Semaphores[SemaphoreCount] );
- directive_failed( status, "semaphore delete" );
-}
-
void create_fifo(void)
{
int status;
@@ -149,17 +111,9 @@ rtems_task Init(
puts( "Creating all barriers" );
create_all_barriers();
- puts( "Creating all semaphores" );
- create_all_semaphores();
-
puts( "Creating FIFO" );
create_fifo();
- puts( "Opening FIFO.. expect ENOMEM (semaphore for pipe could not be created)" );
- open_fifo(ENOMEM, O_RDWR);
-
- delete_semaphore();
-
alloc_ptr = malloc( malloc_free_space() - 4 );
puts("Opening FIFO.. expect ENOMEM since no memory is available");
open_fifo(ENOMEM, O_RDWR);
@@ -173,10 +127,6 @@ rtems_task Init(
open_fifo(ENOMEM, O_RDWR);
delete_barrier();
- puts( "Opening FIFO.. expect ENOMEM (semaphore-1 for pipe could not be created" );
- open_fifo(ENOMEM, O_RDWR);
-
- delete_semaphore();
puts( "Opening FIFO in RDWR mode. Expect OK" );
open_fifo(0, O_RDWR);
++num_opens;
More information about the vc
mailing list