This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.24-441-g01b23a3


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  01b23a30b42a90b1ebd882a0d81110a1542e504a (commit)
      from  67aae64512cb42332f76a83e84ac2bc608ad4ad2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=01b23a30b42a90b1ebd882a0d81110a1542e504a

commit 01b23a30b42a90b1ebd882a0d81110a1542e504a
Author: Florian Weimer <fweimer@redhat.com>
Date:   Fri Dec 2 17:09:19 2016 +0100

    elf/tst-tls-manydynamic: New test
    
    This test adds coverage for creating many dynamic TLS variables
    which exhaust the static TLS allocation.

diff --git a/ChangeLog b/ChangeLog
index f75137b..95b5c7e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2016-12-02  Florian Weimer  <fweimer@redhat.com>
 
+	* elf/Makefile [build-shared] (tests): Add tst-latepthread.
+	(one-hundred, tst-tls-many-dynamic-modules): Define.
+	(modules-names): Add $(tst-tls-many-dynamic-modules).
+	(tst-tls-manydynamic%mod.os): Build with special preprocessor
+	macros.
+	(tst-tls-manydynamic): Link against libdl, libpthread.
+	(tst-tls-manydynamic.out): The test needs the test modules at run
+	time.
+	* elf/tst-tls-manydynamic.c: New file.
+	* elf/tst-tls-manydynamic.h: Likewise.
+	* elf/tst-tls-manydynamicmod.c: Likewise.
+
+2016-12-02  Florian Weimer  <fweimer@redhat.com>
+
 	* sysdeps/aarch64/tlsdesc.sym (TCBHEAD_DTV, DTV_COUNTER)
 	(TLS_DTV_UNALLOCATED): Add.
 	* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Use explicit
diff --git a/elf/Makefile b/elf/Makefile
index 18b3e2a..ebdcbc6 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -152,7 +152,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
 	 tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \
 	 tst-ptrguard1 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
 	 tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \
-	 tst-latepthread
+	 tst-latepthread tst-tls-manydynamic
 #	 reldep9
 ifeq ($(build-hardcoded-path-in-tests),yes)
 tests += tst-dlopen-aout
@@ -173,6 +173,10 @@ tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 tlsmod17a-modules = $(addprefix tst-tlsmod17a, $(tlsmod17a-suffixes))
 tlsmod18a-modules = $(addprefix tst-tlsmod18a, $(tlsmod17a-suffixes))
+one-hundred = $(foreach x,0 1 2 3 4 5 6 7 8 9, \
+  0$x 1$x 2$x 3$x 4$x 5$x 6$x 7$x 8$x 9$x)
+tst-tls-many-dynamic-modules := \
+  $(foreach n,$(one-hundred),tst-tls-manydynamic$(n)mod)
 extra-test-objs += $(tlsmod17a-modules:=.os) $(tlsmod18a-modules:=.os) \
 		   tst-tlsalign-vars.o
 test-extras += tst-tlsmod17a tst-tlsmod18a tst-tlsalign-vars
@@ -227,7 +231,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		tst-tlsalign-lib tst-nodelete-opened-lib tst-nodelete2mod \
 		tst-audit11mod1 tst-audit11mod2 tst-auditmod11 \
 		tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
-		tst-latepthreadmod
+		tst-latepthreadmod $(tst-tls-many-dynamic-modules)
 ifeq (yes,$(have-mtls-dialect-gnu2))
 tests += tst-gnu2-tls1
 modules-names += tst-gnu2-tls1mod
@@ -1278,6 +1282,15 @@ $(objpfx)tst-latepthreadmod.so: $(shared-thread-library)
 $(objpfx)tst-latepthread: $(libdl)
 $(objpfx)tst-latepthread.out: $(objpfx)tst-latepthreadmod.so
 
+# The test modules are parameterized by preprocessor macros.
+$(patsubst %,$(objpfx)%.os,$(tst-tls-many-dynamic-modules)): \
+  $(objpfx)tst-tls-manydynamic%mod.os : tst-tls-manydynamicmod.c
+	$(compile-command.c) \
+	  -DNAME=tls_global_$* -DSETTER=set_value_$* -DGETTER=get_value_$*
+$(objpfx)tst-tls-manydynamic: $(libdl) $(shared-thread-library)
+$(objpfx)tst-tls-manydynamic.out: \
+  $(patsubst %,$(objpfx)%.so,$(tst-tls-many-dynamic-modules))
+
 tst-prelink-ENV = LD_TRACE_PRELINKING=1
 
 $(objpfx)tst-prelink-conflict.out: $(objpfx)tst-prelink.out
diff --git a/elf/tst-tls-manydynamic.c b/elf/tst-tls-manydynamic.c
new file mode 100644
index 0000000..29bf139
--- /dev/null
+++ b/elf/tst-tls-manydynamic.c
@@ -0,0 +1,150 @@
+/* Test with many dynamic TLS variables.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This test intends to exercise dynamic TLS variable allocation.  It
+   achieves this by combining dlopen (to avoid static TLS allocation
+   after static TLS resizing), many DSOs with a large variable (to
+   exceed the static TLS reserve), and an already-running thread (to
+   force full dynamic TLS initialization).  */
+
+#include "tst-tls-manydynamic.h"
+
+#include <dlfcn.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
+
+void *handles[COUNT];
+set_value_func set_value_funcs[COUNT];
+get_value_func get_value_funcs[COUNT];
+
+static void
+init_functions (void)
+{
+  for (int i = 0; i < COUNT; ++i)
+    {
+      /* Open the module.  */
+      {
+        char soname[100];
+        snprintf (soname, sizeof (soname), "tst-tls-manydynamic%02dmod.so", i);
+        handles[i] = dlopen (soname, RTLD_LAZY);
+        if (handles[i] == NULL)
+          {
+            printf ("error: dlopen failed: %s\n", dlerror ());
+            exit (1);
+          }
+      }
+
+      /* Obtain the setter function.  */
+      {
+        char fname[100];
+        snprintf (fname, sizeof (fname), "set_value_%02d", i);
+        void *func = dlsym (handles[i], fname);
+        if (func == NULL)
+          {
+            printf ("error: dlsym: %s\n", dlerror ());
+            exit (1);
+          }
+        set_value_funcs[i] = func;
+      }
+
+      /* Obtain the getter function.  */
+      {
+        char fname[100];
+        snprintf (fname, sizeof (fname), "get_value_%02d", i);
+        void *func = dlsym (handles[i], fname);
+        if (func == NULL)
+          {
+            printf ("error: dlsym: %s\n", dlerror ());
+            exit (1);
+          }
+        get_value_funcs[i] = func;
+      }
+    }
+}
+
+static pthread_barrier_t barrier;
+
+/* Running thread which forces real TLS initialization.  */
+static void *
+blocked_thread_func (void *closure)
+{
+  xpthread_barrier_wait (&barrier);
+
+  /* TLS test runs here in the main thread.  */
+
+  xpthread_barrier_wait (&barrier);
+  return NULL;
+}
+
+static int
+do_test (void)
+{
+  {
+    int ret = pthread_barrier_init (&barrier, NULL, 2);
+    if (ret != 0)
+      {
+        errno = ret;
+        printf ("error: pthread_barrier_init: %m\n");
+        exit (1);
+      }
+  }
+
+  pthread_t blocked_thread = xpthread_create (NULL, blocked_thread_func, NULL);
+  xpthread_barrier_wait (&barrier);
+
+  init_functions ();
+
+  struct value values[COUNT];
+  /* Initialze the TLS variables.  */
+  for (int i = 0; i < COUNT; ++i)
+    {
+      for (int j = 0; j < PER_VALUE_COUNT; ++j)
+        values[i].num[j] = rand ();
+      set_value_funcs[i] (&values[i]);
+    }
+
+  /* Read back their values to check that they do not overlap.  */
+  for (int i = 0; i < COUNT; ++i)
+    {
+      struct value actual;
+      get_value_funcs[i] (&actual);
+
+      for (int j = 0; j < PER_VALUE_COUNT; ++j)
+        if (actual.num[j] != values[i].num[j])
+        {
+          printf ("error: mismatch at variable %d/%d: %d != %d\n",
+                  i, j, actual.num[j], values[i].num[j]);
+          exit (1);
+        }
+    }
+
+  xpthread_barrier_wait (&barrier);
+  xpthread_join (blocked_thread);
+
+  /* Close the modules.  */
+  for (int i = 0; i < COUNT; ++i)
+    dlclose (handles[i]);
+
+  return 0;
+}
diff --git a/elf/tst-tls-manydynamic.h b/elf/tst-tls-manydynamic.h
new file mode 100644
index 0000000..4756ece
--- /dev/null
+++ b/elf/tst-tls-manydynamic.h
@@ -0,0 +1,44 @@
+/* Interfaces for test with many dynamic TLS variables.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef TST_TLS_MANYDYNAMIC_H
+#define TST_TLS_MANYDYNAMIC_H
+
+enum
+  {
+    /* This many TLS variables (and modules) are defined.  */
+    COUNT = 100,
+
+    /* Number of elements in the TLS variable.  */
+    PER_VALUE_COUNT = 1,
+  };
+
+/* The TLS variables are of this type.  We use a larger type to ensure
+   that we can reach the static TLS limit with COUNT variables.  */
+struct value
+{
+  int num[PER_VALUE_COUNT];
+};
+
+/* Set the TLS variable defined in the module.  */
+typedef void (*set_value_func) (const struct value *);
+
+/* Read the TLS variable defined in the module.  */
+typedef void (*get_value_func) (struct value *);
+
+#endif /* TST_TLS_MANYDYNAMICMOD_H */
diff --git a/elf/tst-tls-manydynamicmod.c b/elf/tst-tls-manydynamicmod.c
new file mode 100644
index 0000000..578f11b
--- /dev/null
+++ b/elf/tst-tls-manydynamicmod.c
@@ -0,0 +1,36 @@
+/* Module for test with many dynamic TLS variables.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This file is parameterized by macros NAME, SETTER, GETTER, which
+   are set form the Makefile.  */
+
+#include "tst-tls-manydynamic.h"
+
+__thread struct value NAME;
+
+void
+SETTER (const struct value *value)
+{
+  NAME = *value;
+}
+
+void
+GETTER (struct value *value)
+{
+  *value = NAME;
+}

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                    |   14 ++++
 elf/Makefile                 |   17 ++++-
 elf/tst-tls-manydynamic.c    |  150 ++++++++++++++++++++++++++++++++++++++++++
 elf/tst-tls-manydynamic.h    |   44 ++++++++++++
 elf/tst-tls-manydynamicmod.c |   36 ++++++++++
 5 files changed, 259 insertions(+), 2 deletions(-)
 create mode 100644 elf/tst-tls-manydynamic.c
 create mode 100644 elf/tst-tls-manydynamic.h
 create mode 100644 elf/tst-tls-manydynamicmod.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]