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
+3 -3
View File
@@ -1296,10 +1296,10 @@ static inline void usbmsc_sync_wait(FAR struct usbmsc_dev_s *priv)
do
{
ret = sem_wait(&priv->thsynch);
DEBUGASSERT(ret == OK || errno == EINTR);
ret = nxsem_wait(&priv->thsynch);
DEBUGASSERT(ret == OK || ret == -EINTR);
}
while (ret < 0);
while (ret == -EINTR);
}
/****************************************************************************
+7 -6
View File
@@ -1,7 +1,8 @@
/****************************************************************************
* drivers/usbdev/usbmsc_scsi.c
*
* Copyright (C) 2008-2010, 2012, 2016 Gregory Nutt. All rights reserved.
* Copyright (C) 2008-2010, 2012, 2016-2017 Gregory Nutt. All rights
* reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Mass storage class device. Bulk-only with SCSI subclass.
@@ -391,8 +392,8 @@ static void usbmsc_scsi_wait(FAR struct usbmsc_dev_s *priv)
do
{
ret = sem_wait(&priv->thwaitsem);
DEBUGASSERT(ret == OK || errno == EINTR);
ret = nxsem_wait(&priv->thwaitsem);
DEBUGASSERT(ret == OK || ret == -EINTR);
UNUSED(ret); /* Eliminate warnings when debug is off */
}
while (priv->thwaiting);
@@ -2857,8 +2858,8 @@ void usbmsc_scsi_lock(FAR struct usbmsc_dev_s *priv)
do
{
ret = sem_wait(&priv->thlock);
DEBUGASSERT(ret == OK || errno == EINTR);
ret = nxsem_wait(&priv->thlock);
DEBUGASSERT(ret == OK || ret == -EINTR);
}
while (ret < 0);
while (ret == -EINTR);
}