about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nptl/ChangeLog24
-rw-r--r--nptl/sysdeps/i386/i686/pthread_spin_trylock.S14
-rw-r--r--nptl/sysdeps/i386/pthreaddef.h4
-rw-r--r--nptl/sysdeps/pthread/pthread_sigmask.c6
-rw-r--r--nptl/sysdeps/pthread/pthread_spin_destroy.c (renamed from nptl/sysdeps/i386/pthread_spin_destroy.c)0
-rw-r--r--nptl/sysdeps/x86_64/pthread_spin_init.c1
-rw-r--r--nptl/sysdeps/x86_64/pthread_spin_lock.c1
-rw-r--r--nptl/sysdeps/x86_64/pthread_spin_trylock.c1
-rw-r--r--nptl/sysdeps/x86_64/pthread_spin_unlock.c1
-rw-r--r--nptl/sysdeps/x86_64/pthreaddef.h45
-rw-r--r--nptl/tst-spin2.c18
11 files changed, 103 insertions, 12 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 530d6f49eb..842dedecaf 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,6 +1,28 @@
 2002-11-27  Ulrich Drepper  <drepper@redhat.com>
 
-	* sysdeps/x86_64/pthread_sigmask.c: New file.
+	* sysdeps/x86_64/pthreaddef.h: New file.
+
+	* sysdeps/i386/pthreaddef.h (gettid): Removed.
+
+	* sysdeps/x86_64/pthread_spin_init.c: New file.
+	* sysdeps/x86_64/pthread_spin_lock.c: New file.
+	* sysdeps/x86_64/pthread_spin_trylock.c: New file.
+	* sysdeps/x86_64/pthread_spin_unlock.c: New file.
+
+	* sysdeps/i386/i686/pthread_spin_trylock.S (pthread_spin_trylock):
+	Add missing lock prefix.  Minute optimization.
+
+	* tst-spin2.c (main): Also check successful trylock call.
+
+	* sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Use correct
+	syscall.  Fix typo in case INTERNAL_SYSCALL is not used.
+
+	* sysdeps/i386/pthread_spin_destroy.c: Moved to...
+	* sysdeps/pthread/pthread_spin_destroy.c: ...here.  New file.
+
+	* sysdeps/i386/pthread_sigmask.c: Removed.  Use the generic code.
+	* sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Return correct
+	value in case of an error.  Add support for INTERNAL_SYSCALL.
 
 	* sysdeps/i386/pthread_sigmask.c (pthread_sigmask): Return correct
 	value in case of an error.
diff --git a/nptl/sysdeps/i386/i686/pthread_spin_trylock.S b/nptl/sysdeps/i386/i686/pthread_spin_trylock.S
index 881976c4fe..2ab83e6969 100644
--- a/nptl/sysdeps/i386/i686/pthread_spin_trylock.S
+++ b/nptl/sysdeps/i386/i686/pthread_spin_trylock.S
@@ -19,6 +19,13 @@
 
 #define EBUSY	16
 
+
+#ifdef UP
+# define LOCK
+#else
+# define LOCK lock
+#endif
+
 	.globl	pthread_spin_trylock
 	.type	pthread_spin_trylock,@function
 	.align	16
@@ -26,9 +33,10 @@ pthread_spin_trylock:
 	movl	4(%esp), %edx
 	movl	$1, %eax
 	xorl	%ecx, %ecx
+	LOCK
 	cmpxchgl %ecx, (%edx)
-	movl	$EBUSY, %ecx
-	movl	$0, %eax
-	cmovne	%ecx, %eax
+	movl	$EBUSY, %edx
+	movl	%ecx, %eax
+	cmovne	%edx, %eax
 	ret
 	.size	pthread_spin_trylock,.-pthread_spin_trylock
diff --git a/nptl/sysdeps/i386/pthreaddef.h b/nptl/sysdeps/i386/pthreaddef.h
index 6efa1b6d82..1fe9455848 100644
--- a/nptl/sysdeps/i386/pthreaddef.h
+++ b/nptl/sysdeps/i386/pthreaddef.h
@@ -49,7 +49,3 @@
       asm volatile ("movl %1, %%ebx; int $0x80"				      \
 		    :: "a" (__NR_exit), "r" (val));			      \
   }
-#define gettid()							      \
-  ({ int tid;								      \
-     __asm __volatile ("int $0x80" : "=a" (tid) : "0" (__NR_gettid));	      \
-     tid; })
diff --git a/nptl/sysdeps/pthread/pthread_sigmask.c b/nptl/sysdeps/pthread/pthread_sigmask.c
index 5b46c53715..99ec52baa5 100644
--- a/nptl/sysdeps/pthread/pthread_sigmask.c
+++ b/nptl/sysdeps/pthread/pthread_sigmask.c
@@ -43,12 +43,14 @@ pthread_sigmask (how, newmask, oldmask)
     }
 
 #ifdef INTERNAL_SYSCALL
-  int result = INTERNAL_SYSCALL (sigprocmask, 3, how, newmask, oldmask);
+  /* We know that realtime signals are available if NPTL is used.  */
+  int result = INTERNAL_SYSCALL (rt_sigprocmask, 4, how, newmask, oldmask,
+				 _NSIG / 8);
 
   return (INTERNAL_SYSCALL_ERROR_P (result)
 	  ? INTERNAL_SYSCALL_ERRNO (result)
 	  : 0);
 #else
-  return sigprocmask (how, newmask, oldmask) == -1 : errno : 0;
+  return sigprocmask (how, newmask, oldmask) == -1 ? errno : 0;
 #endif
 }
diff --git a/nptl/sysdeps/i386/pthread_spin_destroy.c b/nptl/sysdeps/pthread/pthread_spin_destroy.c
index 4d0109cf02..4d0109cf02 100644
--- a/nptl/sysdeps/i386/pthread_spin_destroy.c
+++ b/nptl/sysdeps/pthread/pthread_spin_destroy.c
diff --git a/nptl/sysdeps/x86_64/pthread_spin_init.c b/nptl/sysdeps/x86_64/pthread_spin_init.c
new file mode 100644
index 0000000000..55696204c1
--- /dev/null
+++ b/nptl/sysdeps/x86_64/pthread_spin_init.c
@@ -0,0 +1 @@
+#include "../i386/pthread_spin_init.c"
diff --git a/nptl/sysdeps/x86_64/pthread_spin_lock.c b/nptl/sysdeps/x86_64/pthread_spin_lock.c
new file mode 100644
index 0000000000..7cf0e0ecce
--- /dev/null
+++ b/nptl/sysdeps/x86_64/pthread_spin_lock.c
@@ -0,0 +1 @@
+#include "../i386/pthread_spin_lock.c"
diff --git a/nptl/sysdeps/x86_64/pthread_spin_trylock.c b/nptl/sysdeps/x86_64/pthread_spin_trylock.c
new file mode 100644
index 0000000000..7ddb37154b
--- /dev/null
+++ b/nptl/sysdeps/x86_64/pthread_spin_trylock.c
@@ -0,0 +1 @@
+#include "../i386/i686/pthread_spin_trylock.c"
diff --git a/nptl/sysdeps/x86_64/pthread_spin_unlock.c b/nptl/sysdeps/x86_64/pthread_spin_unlock.c
new file mode 100644
index 0000000000..b287dc1f5c
--- /dev/null
+++ b/nptl/sysdeps/x86_64/pthread_spin_unlock.c
@@ -0,0 +1 @@
+#include "../i386/pthread_spin_unlock.c"
diff --git a/nptl/sysdeps/x86_64/pthreaddef.h b/nptl/sysdeps/x86_64/pthreaddef.h
new file mode 100644
index 0000000000..697329c9e4
--- /dev/null
+++ b/nptl/sysdeps/x86_64/pthreaddef.h
@@ -0,0 +1,45 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* Default stack size.  */
+#define ARCH_STACK_DEFAULT_SIZE	(2 * 1024 * 1024)
+
+/* Required stack pointer alignment at beginning.  SSE requires 16
+   bytes.  */
+#define STACK_ALIGN		16
+
+/* Minimal stack size after allocating thread descriptor and guard size.  */
+#define MINIMAL_REST_STACK	2048
+
+/* Alignment requirement for TCB.  */
+#define TCB_ALIGNMENT		16
+
+/* The signal used for asynchronous cancelation.  */
+#define SIGCANCEL		__SIGRTMIN
+
+
+/* Location of current stack frame.  */
+#define CURRENT_STACK_FRAME	__builtin_frame_address (0)
+
+
+/* XXX Until we have a better place keep the definitions here.  */
+
+/* While there is no such syscall.  */
+#define __exit_thread_inline(val) \
+  asm volatile ("syscall" :: "a" (__NR_exit), "D" (val))
diff --git a/nptl/tst-spin2.c b/nptl/tst-spin2.c
index ff7421ae47..c55bc65779 100644
--- a/nptl/tst-spin2.c
+++ b/nptl/tst-spin2.c
@@ -88,12 +88,26 @@ main (void)
   err = pthread_spin_trylock (s);
   if (err == 0)
     {
-      puts ("spin_trylock succeeded");
+      puts ("1st spin_trylock succeeded");
       exit (1);
     }
   else if (err != EBUSY)
     {
-      puts ("spin_trylock didn't return EBUSY");
+      puts ("1st spin_trylock didn't return EBUSY");
+      exit (1);
+    }
+
+  err = pthread_spin_unlock (s);
+  if (err != 0)
+    {
+      puts ("parent: spin_unlock failed");
+      exit (1);
+    }
+
+  err = pthread_spin_trylock (s);
+  if (err != 0)
+    {
+      puts ("2nd spin_trylock failed");
       exit (1);
     }