HP/PA specific posix_spinlock implementation.
[kopensolaris-gnu/glibc.git] / linuxthreads / sysdeps / hppa / pspinlock.c
1 /* POSIX spinlock implementation.  hppa version.
2    Copyright (C) 2000 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    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    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #include <errno.h>
21 #include <pthread.h>
22
23
24 int
25 __pthread_spin_lock (pthread_spinlock_t *lock)
26 {
27   unsigned int val;
28
29   do
30     asm volatile ("ldcw %1,%0"
31                   : "=r" (val), "=m" (*lock)
32                   : "m" (*lock));
33   while (!val);
34
35   return 0;
36 }
37 weak_alias (__pthread_spin_lock, pthread_spin_lock)
38
39
40 int
41 __pthread_spin_trylock (pthread_spinlock_t *lock)
42 {
43   unsigned int val;
44
45   asm volatile ("ldcw %1,%0"
46                 : "=r" (val), "=m" (*lock)
47                 : "m" (*lock));
48
49   return val ? 0 : EBUSY;
50 }
51 weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
52
53
54 int
55 __pthread_spin_unlock (pthread_spinlock_t *lock)
56 {
57   *lock = 1;
58   return 0;
59 }
60 weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
61
62
63 int
64 __pthread_spin_init (pthread_spinlock_t *lock, int pshared)
65 {
66   /* We can ignore the `pshared' parameter.  Since we are busy-waiting
67      all processes which can access the memory location `lock' points
68      to can use the spinlock.  */
69   *lock = 1;
70   return 0;
71 }
72 weak_alias (__pthread_spin_init, pthread_spin_init)
73
74
75 int
76 __pthread_spin_destroy (pthread_spinlock_t *lock)
77 {
78   /* Nothing to do.  */
79   return 0;
80 }
81 weak_alias (__pthread_spin_destroy, pthread_spin_destroy)