public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
From: Thomas Preudhomme <thomas.preudhomme@foss.arm.com>
To: newlib@sourceware.org
Subject: Re: [PATCH 2/3, newlib] Only define static locks in multithreaded mode
Date: Tue, 31 Jan 2017 17:21:00 -0000	[thread overview]
Message-ID: <e4d8761f-be83-ad55-a045-450aa1984c37@foss.arm.com> (raw)
In-Reply-To: <7a943313-48e7-2c8f-7250-ce47aeecda13@foss.arm.com>

[-- Attachment #1: Type: text/plain, Size: 685 bytes --]

And in git format-patch now.

Best regards,

Thomas

On 31/01/17 17:10, Thomas Preudhomme wrote:
> Hi,
>
> 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.
>
> Is this ok for master?
>
> Best regards,
>
> Thomas

[-- Attachment #2: guard_static_lock_single_thread.patch --]
[-- Type: text/x-patch, Size: 6013 bytes --]

From 5788cf9f4ad372a541f654e2919a2a5f9709ec1c Mon Sep 17 00:00:00 2001
From: Thomas Preud'homme <thomas.preudhomme@arm.com>
Date: Mon, 30 Jan 2017 11:23:00 +0000
Subject: [PATCH 1/2] 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.
---
 newlib/libc/include/sys/lock.h     |  6 ++++++
 newlib/libc/posix/telldir.c        | 16 ++++++++++------
 newlib/libc/stdlib/__call_atexit.c |  2 ++
 newlib/libc/stdlib/arc4random.c    |  8 ++++++++
 newlib/libc/stdlib/arc4random.h    |  2 ++
 newlib/libc/stdlib/quick_exit.c    |  6 ++++++
 6 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/newlib/libc/include/sys/lock.h b/newlib/libc/include/sys/lock.h
index 9075e35..a406ec7 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 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);
 }
 
-- 
1.9.1


  reply	other threads:[~2017-01-31 17:21 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-31 17:10 Thomas Preudhomme
2017-01-31 17:21 ` Thomas Preudhomme [this message]
2017-02-10 11:12   ` Thomas Preudhomme
2017-02-13 22:16     ` Jeff Johnston
2017-02-01  8:49 ` Freddie Chopin
2017-02-02 14:32   ` Thomas Preudhomme
2017-02-02 15:46     ` Craig Howland
2017-02-03  9:01       ` Thomas Preudhomme

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e4d8761f-be83-ad55-a045-450aa1984c37@foss.arm.com \
    --to=thomas.preudhomme@foss.arm.com \
    --cc=newlib@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).