Remove wrong but inactive generalization.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / i386 / i486 / pthread_cond_broadcast.S
1 /* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <sysdep.h>
21 #include <shlib-compat.h>
22 #include <lowlevelcond.h>
23
24 #ifdef UP
25 # define LOCK
26 #else
27 # define LOCK lock
28 #endif
29
30 #define SYS_futex               240
31 #define FUTEX_WAIT              0
32 #define FUTEX_WAKE              1
33
34
35         .text
36
37         /* int pthread_cond_broadcast (pthread_cond_t *cond) */
38         .globl  __pthread_cond_broadcast
39         .type   __pthread_cond_broadcast, @function
40         .align  16
41 __pthread_cond_broadcast:
42
43         pushl   %esi
44         pushl   %ebx
45
46         movl    12(%esp), %ebx
47
48         /* Get internal lock.  */
49         movl    $1, %eax
50         LOCK
51 #if cond_lock == 0
52         xaddl   %eax, (%ebx)
53 #else
54         xaddl   %eax, cond_lock(%ebx)
55 #endif
56         testl   %eax, %eax
57         jne     1f
58
59 2:      movl    total_seq+4(%ebx), %eax
60         movl    total_seq(%ebx), %ecx
61         cmpl    wakeup_seq+4(%ebx), %eax
62         ja      3f
63         jb      4f
64         cmpl    wakeup_seq(%ebx), %ecx
65         jna     4f
66
67         /* Case all currently waiting threads to wake up.  */
68 3:      movl    %ecx, wakeup_seq(%ebx)
69         movl    %eax, wakeup_seq+4(%ebx)
70
71         /* Wake up all threads.  */
72         addl    $wakeup_seq, %ebx
73         movl    $FUTEX_WAKE, %ecx
74         xorl    %esi, %esi
75         movl    $SYS_futex, %eax
76         movl    $0x7fffffff, %edx
77         ENTER_KERNEL
78
79         /* Unlock.  */
80 4:      LOCK
81         decl    cond_lock-wakeup_seq(%ebx)
82         jne     5f
83
84 6:      xorl    %eax, %eax
85         popl    %ebx
86         popl    %esi
87         ret
88
89         /* Initial locking failed.  */
90 1:
91 #if cond_lock == 0
92         movl    %ebx, %ecx
93 #else
94         leal    cond_lock(%ebx), %ecx
95 #endif
96         call    __lll_mutex_lock_wait
97         jmp     2b
98
99         /* Unlock in loop requires waekup.  */
100 5:
101         leal    cond_lock-wakeup_seq(%ebx), %eax
102         call    __lll_mutex_unlock_wake
103         jmp     6b
104         .size   __pthread_cond_broadcast, .-__pthread_cond_broadcast
105 versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
106                   GLIBC_2_3_2)