Squashed commit of the following:

This commit backs out most of commit b4747286b1.  That change was added because sem_wait() would sometimes cause cancellation points inappropriated.  But with these recent changes, nxsem_wait() is used instead and it is not a cancellation point.

    In the OS, all calls to sem_wait() changed to nxsem_wait().  nxsem_wait() does not return errors via errno so each place where nxsem_wait() is now called must not examine the errno variable.

    In all OS functions (not libraries), change sem_wait() to nxsem_wait().  This will prevent the OS from creating bogus cancellation points and from modifying the per-task errno variable.

    sched/semaphore:  Add the function nxsem_wait().  This is a new internal OS interface.  It is functionally equivalent to sem_wait() except that (1) it is not a cancellation point, and (2) it does not set the per-thread errno value on return.
This commit is contained in:
Gregory Nutt
2017-10-04 15:22:27 -06:00
parent 42a0796615
commit 9568600ab1
307 changed files with 3421 additions and 2423 deletions
+11 -15
View File
@@ -1,7 +1,7 @@
/****************************************************************************
* fs/nxffs/nxffs_open.c
*
* Copyright (C) 2011, 2013 Gregory Nutt. All rights reserved.
* Copyright (C) 2011, 2013, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* References: Linux/Documentation/filesystems/romfs.txt
@@ -388,11 +388,10 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
* in FLASH, only a single file may be extending the FLASH region.
*/
ret = sem_wait(&volume->wrsem);
if (ret != OK)
ret = nxsem_wait(&volume->wrsem);
if (ret < 0)
{
ferr("ERROR: sem_wait failed: %d\n", ret);
ret = -get_errno();
ferr("ERROR: nxsem_wait failed: %d\n", ret);
goto errout;
}
@@ -401,11 +400,10 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
* after wrsem to avoid deadlocks.
*/
ret = sem_wait(&volume->exclsem);
if (ret != OK)
ret = nxsem_wait(&volume->exclsem);
if (ret < 0)
{
ferr("ERROR: sem_wait failed: %d\n", ret);
ret = -get_errno();
ferr("ERROR: nxsem_wait failed: %d\n", ret);
goto errout_with_wrsem;
}
@@ -699,11 +697,10 @@ static inline int nxffs_rdopen(FAR struct nxffs_volume_s *volume,
* protects the open file list.
*/
ret = sem_wait(&volume->exclsem);
ret = nxsem_wait(&volume->exclsem);
if (ret != OK)
{
ferr("ERROR: sem_wait failed: %d\n", ret);
ret = -get_errno();
ferr("ERROR: nxsem_wait failed: %d\n", ret);
goto errout;
}
@@ -1145,11 +1142,10 @@ int nxffs_close(FAR struct file *filep)
* protects the open file list.
*/
ret = sem_wait(&volume->exclsem);
ret = nxsem_wait(&volume->exclsem);
if (ret != OK)
{
ret = -get_errno();
ferr("ERROR: sem_wait failed: %d\n", ret);
ferr("ERROR: nxsem_wait failed: %d\n", ret);
goto errout;
}