OSDN Git Service

Replace FSF snail mail address with URLs
[uclinux-h8/uClibc.git] / libpthread / linuxthreads / sysdeps / sh / pspinlock.c
1 /* POSIX spinlock implementation.  SH version.
2    Copyright (C) 2000, 2001 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 int
24 __pthread_spin_lock (pthread_spinlock_t *lock)
25 {
26   unsigned int val;
27
28   do
29     __asm__ __volatile__ ("tas.b @%1; movt %0"
30                   : "=r" (val)
31                   : "r" (lock)
32                   : "memory");
33   while (val == 0);
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__ ("tas.b @%1; movt %0"
46                 : "=r" (val)
47                 : "r" (lock)
48                 : "memory");
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   return *lock = 0;
58 }
59 weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
60
61
62 int
63 __pthread_spin_init (pthread_spinlock_t *lock, int pshared)
64 {
65   /* We can ignore the `pshared' parameter.  Since we are busy-waiting
66      all processes which can access the memory location `lock' points
67      to can use the spinlock.  */
68   return *lock = 0;
69 }
70 weak_alias (__pthread_spin_init, pthread_spin_init)
71
72
73 int
74 __pthread_spin_destroy (pthread_spinlock_t *lock)
75 {
76   /* Nothing to do.  */
77   return 0;
78 }
79 weak_alias (__pthread_spin_destroy, pthread_spin_destroy)