aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/posix
diff options
context:
space:
mode:
authorThomas Preud'homme <thomas.preudhomme@arm.com>2017-01-30 11:23:00 +0000
committerJeff Johnston <jjohnstn@redhat.com>2017-02-13 17:04:17 -0500
commitfa55c610facaae12e38d90d14e44fecd1259b3ab (patch)
treece19e155be44925f8bd7ed33b501cc414b47f3d2 /newlib/libc/posix
parentaf272aca591fe1dc0f1be64ae5bda147ea98a047 (diff)
downloadnewlib-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.c16
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