]> git.pld-linux.org Git - packages/glibc.git/commitdiff
- 2.22 branch fixes
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Mon, 26 Oct 2015 13:32:06 +0000 (14:32 +0100)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Mon, 26 Oct 2015 13:32:06 +0000 (14:32 +0100)
glibc-git.patch

index ca3163846d44fec4acee220d1b20a9d48304945c..bd86ae7e1e099e88d0918a96464bd7e47e9801c3 100644 (file)
@@ -1,8 +1,27 @@
 diff --git a/ChangeLog b/ChangeLog
-index cb9124e..d0d2f56 100644
+index cb9124e..b32cd09 100644
 --- a/ChangeLog
 +++ b/ChangeLog
-@@ -1,3 +1,140 @@
+@@ -1,3 +1,159 @@
++2015-10-20  Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
++
++      [BZ #18743]
++      * sysdeps/powerpc/nptl/elide.h (__elide_lock): Move most of this
++      code to...
++      (ELIDE_LOCK): ...here.
++      (__get_new_count): New function with part of the code from
++      __elide_lock that updates the value of adapt_count after a
++      transaction abort.
++      (__elided_trylock): Moved this code to...
++      (ELIDE_TRYLOCK): ...here.
++
++2015-10-06  Florian Weimer  <fweimer@redhat.com>
++
++      [BZ #19018]
++      * stdlib/cxa_thread_atexit_impl.c (__cxa_thread_atexit_impl):
++      Mangle function pointer before storing it.
++      (__call_tls_dtors): Demangle function pointer before calling it.
++
 +2015-10-15  Florian Weimer  <fweimer@redhat.com>
 +
 +      [BZ #18928]
@@ -144,10 +163,10 @@ index cb9124e..d0d2f56 100644
  
        * version.h (RELEASE): Set to "stable".
 diff --git a/NEWS b/NEWS
-index 4c31de7..fa6f58d 100644
+index 4c31de7..92037ce 100644
 --- a/NEWS
 +++ b/NEWS
-@@ -5,6 +5,15 @@ See the end for copying conditions.
+@@ -5,6 +5,16 @@ See the end for copying conditions.
  Please send GNU C library bug reports via <http://sourceware.org/bugzilla/>
  using `glibc' in the "product" field.
  \f
@@ -155,7 +174,8 @@ index 4c31de7..fa6f58d 100644
 +
 +* The following bugs are resolved with this release:
 +
-+  18589, 18778, 18781, 18787, 18796, 18870, 18887, 18921, 18928, 18969.
++  18589, 18743, 18778, 18781, 18787, 18796, 18870, 18887, 18921, 18928,
++  18969, 19018.
 +
 +* The LD_POINTER_GUARD environment variable can no longer be used to
 +  disable the pointer guard feature.  It is always enabled.
@@ -163,7 +183,7 @@ index 4c31de7..fa6f58d 100644
  Version 2.22
  
  * The following bugs are resolved with this release:
-@@ -84,7 +93,7 @@ Version 2.22
+@@ -84,7 +94,7 @@ Version 2.22
    release.  Use of this header will trigger a deprecation warning.
    Application developers should update their code to use <regex.h> instead.
  
@@ -732,6 +752,36 @@ index cac1562..79b2b3e 100755
      if ($name ne "nss_ldap" && $name ne "db1"
        && !($name =~/^nss1_/) && $name ne "thread_db"
        && $name ne "nss_test1" && $name ne "libgcc_s") {
+diff --git a/stdlib/cxa_thread_atexit_impl.c b/stdlib/cxa_thread_atexit_impl.c
+index 2d5d56a..5717f09 100644
+--- a/stdlib/cxa_thread_atexit_impl.c
++++ b/stdlib/cxa_thread_atexit_impl.c
+@@ -98,6 +98,10 @@ static __thread struct link_map *lm_cache;
+ int
+ __cxa_thread_atexit_impl (dtor_func func, void *obj, void *dso_symbol)
+ {
++#ifdef PTR_MANGLE
++  PTR_MANGLE (func);
++#endif
++
+   /* Prepend.  */
+   struct dtor_list *new = calloc (1, sizeof (struct dtor_list));
+   new->func = func;
+@@ -142,9 +146,13 @@ __call_tls_dtors (void)
+   while (tls_dtor_list)
+     {
+       struct dtor_list *cur = tls_dtor_list;
++      dtor_func func = cur->func;
++#ifdef PTR_DEMANGLE
++      PTR_DEMANGLE (func);
++#endif
+       tls_dtor_list = tls_dtor_list->next;
+-      cur->func (cur->obj);
++      func (cur->obj);
+       /* Ensure that the MAP dereference happens before
+        l_tls_dtor_count decrement.  That way, we protect this access from a
 diff --git a/string/Makefile b/string/Makefile
 index 8424a61..ebe9354 100644
 --- a/string/Makefile
@@ -1037,6 +1087,141 @@ index 6509f5c..9edf056 100644
  #endif
    return true;
  }
+diff --git a/sysdeps/powerpc/nptl/elide.h b/sysdeps/powerpc/nptl/elide.h
+index 389f5a5..12171f4 100644
+--- a/sysdeps/powerpc/nptl/elide.h
++++ b/sysdeps/powerpc/nptl/elide.h
+@@ -23,67 +23,78 @@
+ # include <htm.h>
+ # include <elision-conf.h>
+-/* Returns true if the lock defined by is_lock_free as elided.
+-   ADAPT_COUNT is a pointer to per-lock state variable. */
+-
++/* Get the new value of adapt_count according to the elision
++   configurations.  Returns true if the system should retry again or false
++   otherwise.  */
+ static inline bool
+-__elide_lock (uint8_t *adapt_count, int is_lock_free)
++__get_new_count (uint8_t *adapt_count)
+ {
+-  if (*adapt_count > 0)
++  /* A persistent failure indicates that a retry will probably
++     result in another failure.  Use normal locking now and
++     for the next couple of calls.  */
++  if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
+     {
+-      (*adapt_count)--;
++      if (__elision_aconf.skip_lock_internal_abort > 0)
++      *adapt_count = __elision_aconf.skip_lock_internal_abort;
+       return false;
+     }
+-
+-  for (int i = __elision_aconf.try_tbegin; i > 0; i--)
+-    {
+-      if (__builtin_tbegin (0))
+-      {
+-        if (is_lock_free)
+-          return true;
+-        /* Lock was busy.  */
+-        __builtin_tabort (_ABORT_LOCK_BUSY);
+-      }
+-      else
+-      {
+-        /* A persistent failure indicates that a retry will probably
+-           result in another failure.  Use normal locking now and
+-           for the next couple of calls.  */
+-        if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
+-          {
+-            if (__elision_aconf.skip_lock_internal_abort > 0)
+-              *adapt_count = __elision_aconf.skip_lock_internal_abort;
+-            break;
+-          }
+-        /* Same logic as above, but for a number of temporary failures in a
+-           a row.  */
+-        else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0
+-                 && __elision_aconf.try_tbegin > 0)
+-          *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries;
+-      }
+-     }
+-
+-  return false;
++  /* Same logic as above, but for a number of temporary failures in a
++     a row.  */
++  else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0
++         && __elision_aconf.try_tbegin > 0)
++    *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries;
++  return true;
+ }
+-# define ELIDE_LOCK(adapt_count, is_lock_free) \
+-  __elide_lock (&(adapt_count), is_lock_free)
+-
+-
+-static inline bool
+-__elide_trylock (uint8_t *adapt_count, int is_lock_free, int write)
+-{
+-  if (__elision_aconf.try_tbegin > 0)
+-    {
+-      if (write)
+-      __builtin_tabort (_ABORT_NESTED_TRYLOCK);
+-      return __elide_lock (adapt_count, is_lock_free);
+-    }
+-  return false;
+-}
++/* CONCURRENCY NOTES:
++
++   The evaluation of the macro expression is_lock_free encompasses one or
++   more loads from memory locations that are concurrently modified by other
++   threads.  For lock elision to work, this evaluation and the rest of the
++   critical section protected by the lock must be atomic because an
++   execution with lock elision must be equivalent to an execution in which
++   the lock would have been actually acquired and released.  Therefore, we
++   evaluate is_lock_free inside of the transaction that represents the
++   critical section for which we want to use lock elision, which ensures
++   the atomicity that we require.  */
++
++/* Returns 0 if the lock defined by is_lock_free was elided.
++   ADAPT_COUNT is a per-lock state variable.  */
++# define ELIDE_LOCK(adapt_count, is_lock_free)                                \
++  ({                                                                  \
++    int ret = 0;                                                      \
++    if (adapt_count > 0)                                              \
++      (adapt_count)--;                                                        \
++    else                                                              \
++      for (int i = __elision_aconf.try_tbegin; i > 0; i--)            \
++      {                                                               \
++        if (__builtin_tbegin (0))                                     \
++          {                                                           \
++            if (is_lock_free)                                         \
++              {                                                       \
++                ret = 1;                                              \
++                break;                                                \
++              }                                                       \
++            __builtin_tabort (_ABORT_LOCK_BUSY);                      \
++          }                                                           \
++        else                                                          \
++          if (!__get_new_count(&adapt_count))                         \
++            break;                                                    \
++      }                                                               \
++    ret;                                                              \
++  })
+ # define ELIDE_TRYLOCK(adapt_count, is_lock_free, write)      \
+-  __elide_trylock (&(adapt_count), is_lock_free, write)
++  ({                                                          \
++    int ret = 0;                                              \
++    if (__elision_aconf.try_tbegin > 0)                               \
++      {                                                               \
++      if (write)                                              \
++        __builtin_tabort (_ABORT_NESTED_TRYLOCK);             \
++      ret = ELIDE_LOCK (adapt_count, is_lock_free);           \
++      }                                                               \
++    ret;                                                      \
++  })
+ static inline bool
 diff --git a/sysdeps/sparc/sparc32/sem_open.c b/sysdeps/sparc/sparc32/sem_open.c
 index 16cb9ad..59df2d7 100644
 --- a/sysdeps/sparc/sparc32/sem_open.c
This page took 0.054333 seconds and 4 git commands to generate.