xref: /nrf52832-nimble/rt-thread/components/libc/pthreads/pthread_spin.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2010-10-26     Bernard      the first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <pthread.h>
12*10465441SEvalZero 
pthread_spin_init(pthread_spinlock_t * lock,int pshared)13*10465441SEvalZero int pthread_spin_init (pthread_spinlock_t *lock, int pshared)
14*10465441SEvalZero {
15*10465441SEvalZero     if (!lock)
16*10465441SEvalZero         return EINVAL;
17*10465441SEvalZero 
18*10465441SEvalZero     lock->lock = 0;
19*10465441SEvalZero 
20*10465441SEvalZero     return 0;
21*10465441SEvalZero }
22*10465441SEvalZero 
pthread_spin_destroy(pthread_spinlock_t * lock)23*10465441SEvalZero int pthread_spin_destroy (pthread_spinlock_t *lock)
24*10465441SEvalZero {
25*10465441SEvalZero     if (!lock)
26*10465441SEvalZero         return EINVAL;
27*10465441SEvalZero 
28*10465441SEvalZero     return 0;
29*10465441SEvalZero }
30*10465441SEvalZero 
pthread_spin_lock(pthread_spinlock_t * lock)31*10465441SEvalZero int pthread_spin_lock (pthread_spinlock_t *lock)
32*10465441SEvalZero {
33*10465441SEvalZero     if (!lock)
34*10465441SEvalZero         return EINVAL;
35*10465441SEvalZero 
36*10465441SEvalZero     while (!(lock->lock))
37*10465441SEvalZero     {
38*10465441SEvalZero         lock->lock = 1;
39*10465441SEvalZero     }
40*10465441SEvalZero 
41*10465441SEvalZero     return 0;
42*10465441SEvalZero }
43*10465441SEvalZero 
pthread_spin_trylock(pthread_spinlock_t * lock)44*10465441SEvalZero int pthread_spin_trylock (pthread_spinlock_t *lock)
45*10465441SEvalZero {
46*10465441SEvalZero     if (!lock)
47*10465441SEvalZero         return EINVAL;
48*10465441SEvalZero 
49*10465441SEvalZero     if (!(lock->lock))
50*10465441SEvalZero     {
51*10465441SEvalZero         lock->lock = 1;
52*10465441SEvalZero 
53*10465441SEvalZero         return 0;
54*10465441SEvalZero     }
55*10465441SEvalZero 
56*10465441SEvalZero     return EBUSY;
57*10465441SEvalZero }
58*10465441SEvalZero 
pthread_spin_unlock(pthread_spinlock_t * lock)59*10465441SEvalZero int pthread_spin_unlock (pthread_spinlock_t *lock)
60*10465441SEvalZero {
61*10465441SEvalZero     if (!lock)
62*10465441SEvalZero         return EINVAL;
63*10465441SEvalZero     if (!(lock->lock))
64*10465441SEvalZero         return EPERM;
65*10465441SEvalZero 
66*10465441SEvalZero     lock->lock = 0;
67*10465441SEvalZero 
68*10465441SEvalZero     return 0;
69*10465441SEvalZero }
70