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-generic/] [local.h] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
#ifndef _ASM_GENERIC_LOCAL_H
2
#define _ASM_GENERIC_LOCAL_H
3
 
4
#include <linux/percpu.h>
5
#include <linux/hardirq.h>
6
#include <asm/atomic.h>
7
#include <asm/types.h>
8 7 xianfeng
#include <linux/sched.h>
9 3 xianfeng
 
10
/*
11
 * A signed long type for operations which are atomic for a single CPU.
12
 * Usually used in combination with per-cpu variables.
13
 *
14
 * This is the default implementation, which uses atomic_long_t.  Which is
15
 * rather pointless.  The whole point behind local_t is that some processors
16
 * can perform atomic adds and subtracts in a manner which is atomic wrt IRQs
17
 * running on this CPU.  local_t allows exploitation of such capabilities.
18
 */
19
 
20
/* Implement in terms of atomics. */
21
 
22
/* Don't use typedef: don't want them to be mixed with atomic_t's. */
23 7 xianfeng
 
24 3 xianfeng
typedef struct
25
{
26
        atomic_long_t a;
27
} local_t;
28
 
29
#define LOCAL_INIT(i)   { ATOMIC_LONG_INIT(i) }
30
 
31
#define local_read(l)   atomic_long_read(&(l)->a)
32
#define local_set(l,i)  atomic_long_set((&(l)->a),(i))
33
#define local_inc(l)    atomic_long_inc(&(l)->a)
34
#define local_dec(l)    atomic_long_dec(&(l)->a)
35
#define local_add(i,l)  atomic_long_add((i),(&(l)->a))
36
#define local_sub(i,l)  atomic_long_sub((i),(&(l)->a))
37
 
38
#define local_sub_and_test(i, l) atomic_long_sub_and_test((i), (&(l)->a))
39
#define local_dec_and_test(l) atomic_long_dec_and_test(&(l)->a)
40
#define local_inc_and_test(l) atomic_long_inc_and_test(&(l)->a)
41
#define local_add_negative(i, l) atomic_long_add_negative((i), (&(l)->a))
42
#define local_add_return(i, l) atomic_long_add_return((i), (&(l)->a))
43
#define local_sub_return(i, l) atomic_long_sub_return((i), (&(l)->a))
44
#define local_inc_return(l) atomic_long_inc_return(&(l)->a)
45
 
46
#define local_cmpxchg(l, o, n) atomic_long_cmpxchg((&(l)->a), (o), (n))
47
#define local_xchg(l, n) atomic_long_xchg((&(l)->a), (n))
48
#define local_add_unless(l, a, u) atomic_long_add_unless((&(l)->a), (a), (u))
49
#define local_inc_not_zero(l) atomic_long_inc_not_zero(&(l)->a)
50
 
51
/* Non-atomic variants, ie. preemption disabled and won't be touched
52
 * in interrupt, etc.  Some archs can optimize this case well. */
53
#define __local_inc(l)          local_set((l), local_read(l) + 1)
54
#define __local_dec(l)          local_set((l), local_read(l) - 1)
55
#define __local_add(i,l)        local_set((l), local_read(l) + (i))
56
#define __local_sub(i,l)        local_set((l), local_read(l) - (i))
57
 
58
/* Use these for per-cpu local_t variables: on some archs they are
59
 * much more efficient than these naive implementations.  Note they take
60
 * a variable (eg. mystruct.foo), not an address.
61
 */
62
#define cpu_local_read(l)       local_read(&__get_cpu_var(l))
63
#define cpu_local_set(l, i)     local_set(&__get_cpu_var(l), (i))
64
#define cpu_local_inc(l)        local_inc(&__get_cpu_var(l))
65
#define cpu_local_dec(l)        local_dec(&__get_cpu_var(l))
66
#define cpu_local_add(i, l)     local_add((i), &__get_cpu_var(l))
67
#define cpu_local_sub(i, l)     local_sub((i), &__get_cpu_var(l))
68
 
69
/* Non-atomic increments, ie. preemption disabled and won't be touched
70
 * in interrupt, etc.  Some archs can optimize this case well.
71
 */
72
#define __cpu_local_inc(l)      __local_inc(&__get_cpu_var(l))
73
#define __cpu_local_dec(l)      __local_dec(&__get_cpu_var(l))
74
#define __cpu_local_add(i, l)   __local_add((i), &__get_cpu_var(l))
75
#define __cpu_local_sub(i, l)   __local_sub((i), &__get_cpu_var(l))
76
 
77
#endif /* _ASM_GENERIC_LOCAL_H */

powered by: WebSVN 2.1.0

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