aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc')
-rw-r--r--newlib/libc/posix/telldir.c16
-rw-r--r--newlib/libc/stdlib/__call_atexit.c2
-rw-r--r--newlib/libc/stdlib/arc4random.c8
-rw-r--r--newlib/libc/stdlib/arc4random.h2
-rw-r--r--newlib/libc/stdlib/quick_exit.c6
5 files changed, 28 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
diff --git a/newlib/libc/stdlib/__call_atexit.c b/newlib/libc/stdlib/__call_atexit.c
index 7d5e0d0..6a809cc 100644
--- a/newlib/libc/stdlib/__call_atexit.c
+++ b/newlib/libc/stdlib/__call_atexit.c
@@ -11,7 +11,9 @@
/* Make this a weak reference to avoid pulling in free. */
void free(void *) _ATTRIBUTE((__weak__));
+#ifndef __SINGLE_THREAD__
__LOCK_INIT_RECURSIVE(, __atexit_recursive_mutex);
+#endif
#ifdef _REENT_GLOBAL_ATEXIT
struct _atexit *_global_atexit = _NULL;
diff --git a/newlib/libc/stdlib/arc4random.c b/newlib/libc/stdlib/arc4random.c
index 75cdff3..3cccc3e 100644
--- a/newlib/libc/stdlib/arc4random.c
+++ b/newlib/libc/stdlib/arc4random.c
@@ -180,16 +180,24 @@ arc4random(void)
{
uint32_t val;
+#ifndef __SINGLE_THREAD__
_ARC4_LOCK();
+#endif
_rs_random_u32(&val);
+#ifndef __SINGLE_THREAD__
_ARC4_UNLOCK();
+#endif
return val;
}
void
arc4random_buf(void *buf, size_t n)
{
+#ifndef __SINGLE_THREAD__
_ARC4_LOCK();
+#endif
_rs_random_buf(buf, n);
+#ifndef __SINGLE_THREAD__
_ARC4_UNLOCK();
+#endif
}
diff --git a/newlib/libc/stdlib/arc4random.h b/newlib/libc/stdlib/arc4random.h
index 3c5fe23..4b98553 100644
--- a/newlib/libc/stdlib/arc4random.h
+++ b/newlib/libc/stdlib/arc4random.h
@@ -47,7 +47,9 @@
#endif /* _ARC4_LOCK_INIT */
+#ifndef __SINGLE_THREAD__
_ARC4_LOCK_INIT
+#endif
#ifdef _ARC4RANDOM_DATA
_ARC4RANDOM_DATA
diff --git a/newlib/libc/stdlib/quick_exit.c b/newlib/libc/stdlib/quick_exit.c
index aaa5f9f..5ab2609 100644
--- a/newlib/libc/stdlib/quick_exit.c
+++ b/newlib/libc/stdlib/quick_exit.c
@@ -44,7 +44,9 @@ struct quick_exit_handler {
/**
* Lock protecting the handlers list.
*/
+#ifndef __SINGLE_THREAD__
__LOCK_INIT(static, __at_quick_exit_mutex);
+#endif
/**
* Stack of cleanup handlers. These will be invoked in reverse order when
*/
@@ -60,10 +62,14 @@ at_quick_exit(void (*func)(void))
if (NULL == h)
return (1);
h->cleanup = func;
+#ifndef __SINGLE_THREAD__
__lock_acquire(__at_quick_exit_mutex);
+#endif
h->next = handlers;
handlers = h;
+#ifndef __SINGLE_THREAD__
__lock_release(__at_quick_exit_mutex);
+#endif
return (0);
}