diff --git a/newlib/libc/include/sys/lock.h b/newlib/libc/include/sys/lock.h index 9075e35c9179968031010432515e3a845ff6ca8d..a406ec7fd71f10b81bdfb0ca2476fa5ea50e0c0b 100644 --- a/newlib/libc/include/sys/lock.h +++ b/newlib/libc/include/sys/lock.h @@ -8,8 +8,14 @@ typedef int _LOCK_RECURSIVE_T; #include <_ansi.h> +#ifdef __SINGLE_THREAD__ +#define __LOCK_INIT(class,lock) ; +#define __LOCK_INIT_RECURSIVE(class,lock) ; +#else #define __LOCK_INIT(class,lock) static int lock = 0; #define __LOCK_INIT_RECURSIVE(class,lock) static int lock = 0; +#endif + #define __lock_init(lock) (_CAST_VOID 0) #define __lock_init_recursive(lock) (_CAST_VOID 0) #define __lock_close(lock) (_CAST_VOID 0) diff --git a/newlib/libc/posix/telldir.c b/newlib/libc/posix/telldir.c index 0a8eac024b4955cd70b192307938358bb1cb2236..959e3b7bb78860f775e0de2f9d52ff2eb6b67411 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 7d5e0d0464b4b9ff74fcb003d965a3c2da020699..6a809cc4d5bd09905d010fdc21708a537166971d 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.h b/newlib/libc/stdlib/arc4random.h index 3c5fe235338270b1af48190cefa9278ea3af917f..4b9855305f5cbce00dd96ee58ed32d1ad48aa5cf 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/arc4random.c b/newlib/libc/stdlib/arc4random.c index 75cdff3bc4b5d4245cce4130df64aebc956c853f..3cccc3ed46a5e9e756d4e216cb7686589eb60993 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/quick_exit.c b/newlib/libc/stdlib/quick_exit.c index aaa5f9f7f1df12dace7d87271291aa87cd2fb3b1..5ab2609bf04d508a228049a52aea5e6ec7216d54 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); }