From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26350 invoked by alias); 10 Feb 2017 11:12:51 -0000 Mailing-List: contact newlib-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-owner@sourceware.org Received: (qmail 26222 invoked by uid 89); 10 Feb 2017 11:12:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 required=5.0 tests=BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=no version=3.3.2 spammy=928, 1.9.1, 1277, pulling X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 10 Feb 2017 11:12:40 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1128CC14; Fri, 10 Feb 2017 03:12:39 -0800 (PST) Received: from [10.2.206.52] (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B5F5E3F3D6 for ; Fri, 10 Feb 2017 03:12:38 -0800 (PST) Subject: Re: [PATCH 2/3, newlib] Only define static locks in multithreaded mode To: newlib@sourceware.org References: <7a943313-48e7-2c8f-7250-ce47aeecda13@foss.arm.com> From: Thomas Preudhomme Message-ID: <99c5b121-f5bf-a833-3048-8d6ffc95f47a@foss.arm.com> Date: Fri, 10 Feb 2017 11:12:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------A210D7EC70E5C03BA6C7EB69" X-IsSubscribed: yes X-SW-Source: 2017/txt/msg00137.txt.bz2 This is a multi-part message in MIME format. --------------A210D7EC70E5C03BA6C7EB69 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 903 Hi, I've removed the changes to lock.h as requested. Please find attached an updated patch in git format-patch format. Best regards, Thomas On 31/01/17 17:21, Thomas Preudhomme wrote: > 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 --------------A210D7EC70E5C03BA6C7EB69 Content-Type: text/x-patch; name="guard_static_lock_single_thread.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="guard_static_lock_single_thread.patch" Content-length: 5334 >From 90852a60b67b62f3ae28d7f56fc9a6e56c7872e3 Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme 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/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 ++++++ 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); } -- 1.9.1 --------------A210D7EC70E5C03BA6C7EB69--