__libc_lock_define_initialized: Always initialize the lock
Commit Message
Since GCC 4.0, GCC will put zero-initialized variables into .bss.
This makes the macro suitable for automatic variables, too.
On x86_64-redhat-linux-gnu, all DSOs except libc.so.6 are unchanged.
The differences for libc.so.6 are harmless, the symbols still end up in
.bss:
<https://gcc.gnu.org/ml/gcc-help/2015-11/msg00211.html>
I think this change is still worthwhile because it removes a nasty
source of errors, a macro with “initialized” in the name which does not
actually initialize anything.
Florian
Comments
On 24-11-2015 19:44, Florian Weimer wrote:
> Since GCC 4.0, GCC will put zero-initialized variables into .bss.
> This makes the macro suitable for automatic variables, too.
>
> On x86_64-redhat-linux-gnu, all DSOs except libc.so.6 are unchanged.
> The differences for libc.so.6 are harmless, the symbols still end up in
> .bss:
>
> <https://gcc.gnu.org/ml/gcc-help/2015-11/msg00211.html>
>
> I think this change is still worthwhile because it removes a nasty
> source of errors, a macro with “initialized” in the name which does not
> actually initialize anything.
>
> Florian
>
LGTM. Since you touching this, I think it is worthwhile to cleanup the
LLL_LOCK_INITIALIZER{_LOCKED,_WAITERS} definition (i386, sparc, and
x86_64 redefines it to same value).
On 25-11-2015 17:24, Florian Weimer wrote:
> On 11/25/2015 07:43 PM, Adhemerval Zanella wrote:
>
>> LGTM. Since you touching this, I think it is worthwhile to cleanup the
>> LLL_LOCK_INITIALIZER{_LOCKED,_WAITERS} definition (i386, sparc, and
>> x86_64 redefines it to same value).
>
> Do you suggest to remove the architecture-specific #defines?
Yes, since right now they are equal to default one at
sysdeps/nptl/lowlevellock.h, and I see not reason to have different
definition for each architecture.
>
> Thanks,
> Florian
>
2015-11-24 Florian Weimer <fweimer@redhat.com>
* sysdeps/nptl/libc-lockP.h (__libc_lock_define_initialized):
Always initialize the lock.
@@ -66,27 +66,15 @@ typedef pthread_key_t __libc_key_t;
#define __rtld_lock_define_recursive(CLASS,NAME) \
CLASS __rtld_lock_recursive_t NAME;
-/* Define an initialized lock variable NAME with storage class CLASS.
-
- For the C library we take a deeper look at the initializer. For
- this implementation all fields are initialized to zero. Therefore
- we don't initialize the variable which allows putting it into the
- BSS section. (Except on PA-RISC and other odd architectures, where
- initialized locks must be set to one due to the lack of normal
- atomic operations.) */
+/* Define an initialized lock variable NAME with storage class CLASS. */
#define _LIBC_LOCK_INITIALIZER LLL_LOCK_INITIALIZER
#if IS_IN (libc) || IS_IN (libpthread)
-# if LLL_LOCK_INITIALIZER == 0
-# define __libc_lock_define_initialized(CLASS,NAME) \
- CLASS __libc_lock_t NAME;
-# else
-# define __libc_lock_define_initialized(CLASS,NAME) \
+# define __libc_lock_define_initialized(CLASS,NAME) \
CLASS __libc_lock_t NAME = LLL_LOCK_INITIALIZER;
-# endif
#else
# define __libc_lock_define_initialized(CLASS,NAME) \
- CLASS __libc_lock_t NAME;
+ CLASS __libc_lock_t NAME = PTHREAD_MUTEX_INITIALIZER;
#endif
#define __libc_rwlock_define_initialized(CLASS,NAME) \