diff options
author | Thomas Preud'homme <thomas.preudhomme@arm.com> | 2017-01-30 11:23:00 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2017-02-13 17:04:17 -0500 |
commit | fa55c610facaae12e38d90d14e44fecd1259b3ab (patch) | |
tree | ce19e155be44925f8bd7ed33b501cc414b47f3d2 /newlib/libc/posix | |
parent | af272aca591fe1dc0f1be64ae5bda147ea98a047 (diff) | |
download | newlib-fa55c610facaae12e38d90d14e44fecd1259b3ab.zip newlib-fa55c610facaae12e38d90d14e44fecd1259b3ab.tar.gz newlib-fa55c610facaae12e38d90d14e44fecd1259b3ab.tar.bz2 |
Only define static locks in multithreaded mode
Newlib build system defines __SINGLE_THREAD__ to allow concurrency code
to be only compiled when newlib is configured for multithread. One such
example are locks which become useless in single thread mode. Although
most static locks are indeed guarded by !defined(__SINGLE_THREAD__),
some are not.
This commit adds these missing guards to __dd_hash_mutex,
__atexit_recursive_mutex, __at_quick_exit_mutex and __arc4random_mutex.
It also makes sure locking macros in lock.h are noop in single thread
mode.
Diffstat (limited to 'newlib/libc/posix')
-rw-r--r-- | newlib/libc/posix/telldir.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/newlib/libc/posix/telldir.c b/newlib/libc/posix/telldir.c index 0a8eac0..959e3b7 100644 --- a/newlib/libc/posix/telldir.c +++ b/newlib/libc/posix/telldir.c @@ -70,7 +70,7 @@ struct ddloc { static long dd_loccnt = 1; /* Index of entry for sequential readdir's */ static struct ddloc *dd_hash[NDIRHASH]; /* Hash list heads for ddlocs */ -#ifdef HAVE_DD_LOCK +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) __LOCK_INIT(static, __dd_hash_mutex); #endif @@ -92,8 +92,10 @@ _DEFUN(telldir, (dirp), #ifdef HAVE_DD_LOCK __lock_acquire_recursive(dirp->dd_lock); +#ifndef __SINGLE_THREAD__ __lock_acquire(__dd_hash_mutex); #endif +#endif index = dd_loccnt++; lp->loc_index = index; lp->loc_seek = dirp->dd_seek; @@ -102,7 +104,9 @@ _DEFUN(telldir, (dirp), lp->loc_next = dd_hash[LOCHASH(index)]; dd_hash[LOCHASH(index)] = lp; #ifdef HAVE_DD_LOCK +#ifndef __SINGLE_THREAD__ __lock_release(__dd_hash_mutex); +#endif __lock_release_recursive(dirp->dd_lock); #endif return (index); @@ -123,7 +127,7 @@ _DEFUN(_seekdir, (dirp, loc), register struct ddloc **prevlp; struct dirent *dp; -#ifdef HAVE_DD_LOCK +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) __lock_acquire(__dd_hash_mutex); #endif if (loc != 0) { @@ -136,7 +140,7 @@ _DEFUN(_seekdir, (dirp, loc), lp = lp->loc_next; } if (lp == NULL) { -#ifdef HAVE_DD_LOCK +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) __lock_release(__dd_hash_mutex); #endif return; @@ -162,7 +166,7 @@ found: dirp->dd_seek = 0; dirp->dd_loc = 0; } -#ifdef HAVE_DD_LOCK +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) __lock_release(__dd_hash_mutex); #endif } @@ -174,7 +178,7 @@ _DEFUN(_cleanupdir, (dirp), { int i; -#ifdef HAVE_DD_LOCK +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) __lock_acquire(__dd_hash_mutex); #endif for (i = 0; i < NDIRHASH; ++i) { @@ -199,7 +203,7 @@ _DEFUN(_cleanupdir, (dirp), } dd_hash[i] = head.loc_next; } -#ifdef HAVE_DD_LOCK +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) __lock_release(__dd_hash_mutex); #endif |