OSDN Git Service

Replace FSF snail mail address with URLs
[uclinux-h8/uClibc.git] / libpthread / linuxthreads / sysdeps / arm / pspinlock.c
1 /* POSIX spinlock implementation.  Arm 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 Lesser General Public License as
7    published by the Free Software Foundation; either version 2.1 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    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; see the file COPYING.LIB.  If
17    not, see <http://www.gnu.org/licenses/>.  */
18
19 #include <errno.h>
20 #include <pthread.h>
21 #include "internals.h"
22
23
24 int
25 __pthread_spin_lock (pthread_spinlock_t *lock)
26 {
27   unsigned int val;
28
29   do
30     __asm__ __volatile__ ("swp %0, %1, [%2]"
31                   : "=r" (val)
32                   : "0" (1), "r" (lock)
33                   : "memory");
34   while (val != 0);
35
36   return 0;
37 }
38 weak_alias (__pthread_spin_lock, pthread_spin_lock)
39
40
41 int
42 __pthread_spin_trylock (pthread_spinlock_t *lock)
43 {
44   unsigned int val;
45
46   __asm__ __volatile__ ("swp %0, %1, [%2]"
47                 : "=r" (val)
48                 : "0" (1), "r" (lock)
49                 : "memory");
50
51   return val ? EBUSY : 0;
52 }
53 weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
54
55
56 int
57 __pthread_spin_unlock (pthread_spinlock_t *lock)
58 {
59   return *lock = 0;
60 }
61 weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
62
63
64 int
65 __pthread_spin_init (pthread_spinlock_t *lock, int pshared)
66 {
67   /* We can ignore the `pshared' parameter.  Since we are busy-waiting
68      all processes which can access the memory location `lock' points
69      to can use the spinlock.  */
70   return *lock = 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)