[COMMITTED] NaCl: Add NaCl-specific __lll_timedlock_wait.

Message ID 20150526223124.432552C3A08@topped-with-meat.com
State Committed
Headers

Commit Message

Roland McGrath May 26, 2015, 10:31 p.m. UTC
  * sysdeps/nacl/lll_timedlock_wait.c: New file.
  

Comments

Torvald Riegel May 27, 2015, 8:44 a.m. UTC | #1
On Tue, 2015-05-26 at 15:31 -0700, Roland McGrath wrote:
> +/* This behaves the same as the generic version in nptl/.  It's simpler
> +   because it doesn't need to convert an absolute timeout to a relative
> +   one (and back again in the lll_futex_timed_wait macro).  */

If you remember the new glibc-internal futex API I proposed, it provided
variants for both absolute and relative timeouts.  Would now be a good
time to pursue adding this API so that changes like this wouldn't need
to be NaCl-specific?
  
Roland McGrath June 9, 2015, 11:44 p.m. UTC | #2
> On Tue, 2015-05-26 at 15:31 -0700, Roland McGrath wrote:
> > +/* This behaves the same as the generic version in nptl/.  It's simpler
> > +   because it doesn't need to convert an absolute timeout to a relative
> > +   one (and back again in the lll_futex_timed_wait macro).  */
> 
> If you remember the new glibc-internal futex API I proposed, it provided
> variants for both absolute and relative timeouts.  Would now be a good
> time to pursue adding this API so that changes like this wouldn't need
> to be NaCl-specific?

Certainly!  As you might surmise, I'm going through old email backlog now.
I hope to get caught up by the end of this week, and then be in a position
to interact helpfully on new reviews.  (I've seen your new futex API patch
but not read it yet, and will get through all the old backlog first.)


Thanks,
Roland
  

Patch

diff --git a/sysdeps/nacl/lll_timedlock_wait.c b/sysdeps/nacl/lll_timedlock_wait.c
new file mode 100644
index 0000000..df951ee
--- /dev/null
+++ b/sysdeps/nacl/lll_timedlock_wait.c
@@ -0,0 +1,52 @@ 
+/* Timed low level locking for pthread library.  NaCl version.
+   Copyright (C) 2015 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 <assert.h>
+#include <atomic.h>
+#include <errno.h>
+#include <lowlevellock.h>
+#include <sys/time.h>
+
+
+/* This behaves the same as the generic version in nptl/.  It's simpler
+   because it doesn't need to convert an absolute timeout to a relative
+   one (and back again in the lll_futex_timed_wait macro).  */
+
+int
+__lll_timedlock_wait (int *futex, const struct timespec *abstime, int private)
+{
+  /* Reject invalid timeouts.  */
+  if (__glibc_unlikely (abstime->tv_nsec < 0)
+      || __glibc_unlikely (abstime->tv_nsec >= 1000000000))
+    return EINVAL;
+
+  /* Try locking.  */
+  int result = 0;
+  while (atomic_exchange_acq (futex, 2) != 0)
+    {
+      /* If *futex == 2, wait until woken or timeout.  */
+      result = __nacl_irt_futex.futex_wait_abs ((volatile int *) futex, 2,
+						abstime);
+      if (__glibc_likely (result == 0)
+	  || __glibc_likely (result == ETIMEDOUT))
+	break;
+      assert (result == EAGAIN);
+    }
+
+  return result;
+}