pthread_spin.c 1020 字节
Newer Older
Y
yiyue.fang 已提交
1
/*
2
 * Copyright (c) 2006-2018, RT-Thread Development Team
Y
yiyue.fang 已提交
3
 *
4
 * SPDX-License-Identifier: Apache-2.0
Y
yiyue.fang 已提交
5 6 7 8 9 10
 *
 * Change Logs:
 * Date           Author       Notes
 * 2010-10-26     Bernard      the first version
 */

M
Ming, Bai 已提交
11 12 13 14
#include <pthread.h>

int pthread_spin_init (pthread_spinlock_t *lock, int pshared)
{
Y
yiyue.fang 已提交
15 16 17 18
    if (!lock)
        return EINVAL;

    lock->lock = 0;
M
Ming, Bai 已提交
19

Y
yiyue.fang 已提交
20
    return 0;
M
Ming, Bai 已提交
21 22 23 24
}

int pthread_spin_destroy (pthread_spinlock_t *lock)
{
Y
yiyue.fang 已提交
25 26
    if (!lock)
        return EINVAL;
M
Ming, Bai 已提交
27

Y
yiyue.fang 已提交
28
    return 0;
M
Ming, Bai 已提交
29 30 31 32
}

int pthread_spin_lock (pthread_spinlock_t *lock)
{
Y
yiyue.fang 已提交
33 34
    if (!lock)
        return EINVAL;
M
Ming, Bai 已提交
35

Y
yiyue.fang 已提交
36 37 38 39
    while (!(lock->lock))
    {
        lock->lock = 1;
    }
M
Ming, Bai 已提交
40

Y
yiyue.fang 已提交
41
    return 0;
M
Ming, Bai 已提交
42 43 44 45
}

int pthread_spin_trylock (pthread_spinlock_t *lock)
{
Y
yiyue.fang 已提交
46 47 48 49 50 51
    if (!lock)
        return EINVAL;

    if (!(lock->lock))
    {
        lock->lock = 1;
M
Ming, Bai 已提交
52

Y
yiyue.fang 已提交
53 54
        return 0;
    }
M
Ming, Bai 已提交
55

Y
yiyue.fang 已提交
56
    return EBUSY;
M
Ming, Bai 已提交
57 58 59 60
}

int pthread_spin_unlock (pthread_spinlock_t *lock)
{
Y
yiyue.fang 已提交
61 62 63 64
    if (!lock)
        return EINVAL;
    if (!(lock->lock))
        return EPERM;
M
Ming, Bai 已提交
65

Y
yiyue.fang 已提交
66
    lock->lock = 0;
M
Ming, Bai 已提交
67

Y
yiyue.fang 已提交
68
    return 0;
M
Ming, Bai 已提交
69
}