OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [include/] [asm-or32/] [semaphore-helper.h] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 xianfeng
/*
2
 * taken from cris port.
3
 *
4
 * SMP- and interrupt-safe semaphores helper functions. Generic versions, no
5
 * optimizations whatsoever...
6
 *
7
 */
8
 
9
#ifndef _OR32_SEMAPHORE_HELPER_H
10
#define _OR32_SEMAPHORE_HELPER_H
11
 
12
#include <asm/atomic.h>
13
#include <linux/errno.h>
14
 
15
#define read(a) ((a)->counter)
16
#define inc(a) (((a)->counter)++)
17
#define dec(a) (((a)->counter)--)
18
 
19
#define count_inc(a) ((*(a))++)
20
 
21
/*
22
 * These two _must_ execute atomically wrt each other.
23
 */
24
static inline void wake_one_more(struct semaphore * sem)
25
{
26
        atomic_inc(&sem->waking);
27
}
28
 
29
static inline int waking_non_zero(struct semaphore *sem)
30
{
31
        unsigned long flags;
32
        int ret = 0;
33
 
34
        local_irq_save(flags);
35
        if (read(&sem->waking) > 0) {
36
                dec(&sem->waking);
37
                ret = 1;
38
        }
39
        local_irq_restore(flags);
40
        return ret;
41
}
42
 
43
static inline int waking_non_zero_interruptible(struct semaphore *sem,
44
                                                struct task_struct *tsk)
45
{
46
        int ret = 0;
47
        unsigned long flags;
48
 
49
        local_irq_save(flags);
50
        if (read(&sem->waking) > 0) {
51
                dec(&sem->waking);
52
                ret = 1;
53
        } else if (signal_pending(tsk)) {
54
                inc(&sem->count);
55
                ret = -EINTR;
56
        }
57
        local_irq_restore(flags);
58
        return ret;
59
}
60
 
61
static inline int waking_non_zero_trylock(struct semaphore *sem)
62
{
63
        int ret = 1;
64
        unsigned long flags;
65
 
66
        local_irq_save(flags);
67
        if (read(&sem->waking) <= 0)
68
                inc(&sem->count);
69
        else {
70
                dec(&sem->waking);
71
                ret = 0;
72
        }
73
        local_irq_restore(flags);
74
        return ret;
75
}
76
 
77
#endif
78
 
79
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.