Wake only when there are waiters.
authordrepper <drepper>
Sat, 26 May 2007 01:31:11 +0000 (01:31 +0000)
committerdrepper <drepper>
Sat, 26 May 2007 01:31:11 +0000 (01:31 +0000)
nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S
nptl/sysdeps/unix/sysv/linux/sem_post.c
nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S

index 71e96d2..e66db14 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -20,6 +20,7 @@
 #include <sysdep.h>
 #include <shlib-compat.h>
 #include <pthread-errnos.h>
 #include <sysdep.h>
 #include <shlib-compat.h>
 #include <pthread-errnos.h>
+#include <structsem.h>
 
 #ifndef UP
 # define LOCK lock
 
 #ifndef UP
 # define LOCK lock
@@ -40,19 +41,26 @@ __new_sem_post:
        pushl   %ebx
 
        movl    8(%esp), %ebx
        pushl   %ebx
 
        movl    8(%esp), %ebx
-       movl    $1, %edx
+
        LOCK
        LOCK
-       xaddl   %edx, (%ebx)
+#if VALUE == 0
+       addl    $1, (%ebx)
+#else
+       addl    $1, VALUE(%ebx)
+#endif
+
+       cmpl    $0, NWAITERS(%ebx)
+       je      2f
 
        movl    $SYS_futex, %eax
        movl    $FUTEX_WAKE, %ecx
 
        movl    $SYS_futex, %eax
        movl    $FUTEX_WAKE, %ecx
-       addl    $1, %edx
+       movl    $1, %edx
        ENTER_KERNEL
 
        testl   %eax, %eax
        js      1f
 
        ENTER_KERNEL
 
        testl   %eax, %eax
        js      1f
 
-       xorl    %eax, %eax
+2:     xorl    %eax, %eax
        popl    %ebx
        ret
 
        popl    %ebx
        ret
 
index 671b43f..f8bc695 100644 (file)
@@ -1,5 +1,5 @@
 /* sem_post -- post to a POSIX semaphore.  Generic futex-using version.
 /* sem_post -- post to a POSIX semaphore.  Generic futex-using version.
-   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
 
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
 
 int
 __new_sem_post (sem_t *sem)
 {
 int
 __new_sem_post (sem_t *sem)
 {
+  struct new_sem *isem = (struct new_sem *) sem;
+
+  int nr = atomic_increment_val (&isem->value);
+  atomic_full_barrier ();
+  if (isem->nwaiters > 0)
+    {
+      int err = lll_futex_wake (&isem->value, 1);
+      if (__builtin_expect (err, 0) < 0)
+       {
+         __set_errno (-err);
+         return -1;
+       }
+    }
+  return 0;
+}
+versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_1);
+
+
+#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1)
+int
+attribute_compat_text_section
+__old_sem_post (sem_t *sem)
+{
   int *futex = (int *) sem;
 
   int nr = atomic_increment_val (futex);
   int *futex = (int *) sem;
 
   int nr = atomic_increment_val (futex);
-  int err = lll_futex_wake (futex, nr);
+  int err = lll_futex_wake (futex, 1);
   if (__builtin_expect (err, 0) < 0)
     {
       __set_errno (-err);
   if (__builtin_expect (err, 0) < 0)
     {
       __set_errno (-err);
@@ -40,8 +63,5 @@ __new_sem_post (sem_t *sem)
     }
   return 0;
 }
     }
   return 0;
 }
-versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_1);
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1)
-strong_alias (__new_sem_post, __old_sem_post)
 compat_symbol (libpthread, __old_sem_post, sem_post, GLIBC_2_0);
 #endif
 compat_symbol (libpthread, __old_sem_post, sem_post, GLIBC_2_0);
 #endif
index 7f608a5..1f5d0bb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -20,6 +20,7 @@
 #include <sysdep.h>
 #include <shlib-compat.h>
 #include <pthread-errnos.h>
 #include <sysdep.h>
 #include <shlib-compat.h>
 #include <pthread-errnos.h>
+#include <structsem.h>
 
 #ifndef UP
 # define LOCK lock
 
 #ifndef UP
 # define LOCK lock
        .type   sem_post,@function
        .align  16
 sem_post:
        .type   sem_post,@function
        .align  16
 sem_post:
-       movl    $1, %edx
        LOCK
        LOCK
-       xaddl   %edx, (%rdi)
+#if VALUE == 0
+       addl    $1, (%rdi)
+#else
+       addl    $1, VALUE(%rdi)
+#endif
+
+       cmpq    $0, NWAITERS(%rdi)
+       je      2f
 
        movl    $SYS_futex, %eax
        movl    $FUTEX_WAKE, %esi
 
        movl    $SYS_futex, %eax
        movl    $FUTEX_WAKE, %esi
-       incl    %edx
+       movl    $1, %edx
        syscall
 
        testq   %rax, %rax
        js      1f
 
        syscall
 
        testq   %rax, %rax
        js      1f
 
-       xorl    %eax, %eax
+2:     xorl    %eax, %eax
        retq
 
 1:
        retq
 
 1: