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.23-547-geaee348


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  eaee348ce71c34faa7a1122529aa9b9807a269c2 (commit)
       via  d3016ce02c7ba85c1c619771bb1aa349038626cd (commit)
      from  318132f4d41a5742c37d37d67529c24d28797d8a (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=eaee348ce71c34faa7a1122529aa9b9807a269c2

commit eaee348ce71c34faa7a1122529aa9b9807a269c2
Author: Andreas Schwab <schwab@suse.de>
Date:   Thu Jun 16 13:58:02 2016 +0200

    Add test case for bug 20263

diff --git a/ChangeLog b/ChangeLog
index 63dfbc5..5e22584 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-07-07  Andreas Schwab  <schwab@suse.de>
+
+	[BZ #20263]
+	* nptl/tst-robust10.c: New test.
+	* nptl/Makefile (tests): Add tst-robust10.
+
 2016-07-07  Jiyoung Yun  <t2wish@gmail.com>
 
 	[BZ #20263]
diff --git a/nptl/Makefile b/nptl/Makefile
index 6322107..0d8aade 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -290,7 +290,7 @@ tests = tst-typesizes \
 	tst-initializers1 $(addprefix tst-initializers1-,\
 			    c89 gnu89 c99 gnu99 c11 gnu11) \
 	tst-bad-schedattr \
-	tst-thread_local1 tst-mutex-errorcheck
+	tst-thread_local1 tst-mutex-errorcheck tst-robust10
 xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \
 	tst-mutexpp1 tst-mutexpp6 tst-mutexpp10
 test-srcs = tst-oddstacklimit
diff --git a/nptl/tst-robust10.c b/nptl/tst-robust10.c
new file mode 100644
index 0000000..6d9e502
--- /dev/null
+++ b/nptl/tst-robust10.c
@@ -0,0 +1,110 @@
+/* Test that pthread_mutex_timedlock properly times out.
+   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/>.  */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+pthread_mutex_t mutex;
+
+static void *
+thr (void *arg)
+{
+  struct timespec abstime;
+  clock_gettime (CLOCK_REALTIME, &abstime);
+  abstime.tv_sec += 1;
+  int ret = pthread_mutex_timedlock (&mutex, &abstime);
+  if (ret == 0)
+    {
+      puts ("mutex_timedlock didn't fail");
+      exit (1);
+    }
+  if (ret != ETIMEDOUT)
+    {
+      printf ("mutex_timedlock failed: %s\n", strerror (ret));
+      exit (1);
+    }
+
+  return 0;
+}
+
+static int
+do_test (void)
+{
+  pthread_t pt;
+  pthread_mutexattr_t ma;
+
+  if (pthread_mutexattr_init (&ma) != 0)
+    {
+      puts ("mutexattr_init failed");
+      return 0;
+    }
+  if (pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP) != 0)
+    {
+      puts ("mutexattr_setrobust failed");
+      return 1;
+    }
+  if (pthread_mutex_init (&mutex, &ma))
+    {
+      puts ("mutex_init failed");
+      return 1;
+    }
+
+  if (pthread_mutexattr_destroy (&ma))
+    {
+      puts ("mutexattr_destroy failed");
+      return 1;
+    }
+
+  if (pthread_mutex_lock (&mutex))
+    {
+      puts ("mutex_lock failed");
+      return 1;
+    }
+
+  if (pthread_create (&pt, NULL, thr, NULL))
+    {
+      puts ("pthread_create failed");
+      return 1;
+    }
+
+  if (pthread_join (pt, NULL))
+    {
+      puts ("pthread_join failed");
+      return 1;
+    }
+
+  if (pthread_mutex_unlock (&mutex))
+    {
+      puts ("mutex_unlock failed");
+      return 1;
+    }
+
+  if (pthread_mutex_destroy (&mutex))
+    {
+      puts ("mutex_destroy failed");
+      return 1;
+    }
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d3016ce02c7ba85c1c619771bb1aa349038626cd

commit d3016ce02c7ba85c1c619771bb1aa349038626cd
Author: Jiyoung Yun <t2wish@gmail.com>
Date:   Thu Jun 30 01:15:44 2016 +0900

    Fix robust mutex daedlock [BZ #20263]
    
    In Linux/ARM environment, a robust mutex can't catch the timeout result
    when it is already owned by other thread and requests to try lock with
    a specific time value(pthread_mutex_timedlock). The futex already returns
    the ETIMEDOUT result but there is no check the return value and it makes
    a deadlock.
    
    * nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.

diff --git a/ChangeLog b/ChangeLog
index 690012c..63dfbc5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-07-07  Jiyoung Yun  <t2wish@gmail.com>
+
+	[BZ #20263]
+	* nptl/lowlevelrobustlock.c: Implement ETIMEDOUT logic.
+
 2016-07-06  Stefan Liebler  <stli@linux.vnet.ibm.com>
 
 	* sysdeps/s390/linkmap.h (struct link_map_machine):
diff --git a/nptl/lowlevelrobustlock.c b/nptl/lowlevelrobustlock.c
index 3b988b2..efe307e 100644
--- a/nptl/lowlevelrobustlock.c
+++ b/nptl/lowlevelrobustlock.c
@@ -118,8 +118,11 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime,
      || !defined lll_futex_timed_wait_bitset)
       lll_futex_timed_wait (futex, newval, &rt, private);
 #else
-      lll_futex_timed_wait_bitset (futex, newval, abstime,
-				   FUTEX_CLOCK_REALTIME, private);
+      int err = lll_futex_timed_wait_bitset (futex, newval, abstime,
+					     FUTEX_CLOCK_REALTIME, private);
+      /* The futex call timed out.  */
+      if (err == -ETIMEDOUT)
+         return -err;
 #endif
 
     try:

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

Summary of changes:
 ChangeLog                 |   11 +++++
 nptl/Makefile             |    2 +-
 nptl/lowlevelrobustlock.c |    7 ++-
 nptl/tst-robust10.c       |  110 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 127 insertions(+), 3 deletions(-)
 create mode 100644 nptl/tst-robust10.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]