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
+26 -4
View File
@@ -499,10 +499,21 @@ void up_rngaddentropy(enum rnd_source_t kindof, FAR const uint32_t *buf,
void up_rngreseed(void)
{
while (sem_wait(&g_rng.rd_sem) != 0)
int ret;
do
{
assert(errno == EINTR);
/* Take the semaphore (perhaps waiting) */
ret = nxsem_wait(&g_rng.rd_sem);
/* The only case that an error should occur here is if the wait was
* awakened by a signal.
*/
DEBUGASSERT(ret == OK || ret == -EINTR);
}
while (ret == -EINTR);
if (g_rng.rd_newentr >= MIN_SEED_NEW_ENTROPY_WORDS)
{
@@ -551,10 +562,21 @@ void up_randompool_initialize(void)
void getrandom(FAR void *bytes, size_t nbytes)
{
while (sem_wait(&g_rng.rd_sem) != 0)
int ret;
do
{
assert(errno == EINTR);
/* Take the semaphore (perhaps waiting) */
ret = nxsem_wait(&g_rng.rd_sem);
/* The only case that an error should occur here is if the wait was
* awakened by a signal.
*/
DEBUGASSERT(ret == OK || ret == -EINTR);
}
while (ret == -EINTR);
rng_buf_internal(bytes, nbytes);
nxsem_post(&g_rng.rd_sem);