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/] [net/] [tipc/] [ref.h] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
 * net/tipc/ref.h: Include file for TIPC object registry code
3
 *
4
 * Copyright (c) 1991-2006, Ericsson AB
5
 * Copyright (c) 2005, Wind River Systems
6
 * All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions are met:
10
 *
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 * 3. Neither the names of the copyright holders nor the names of its
17
 *    contributors may be used to endorse or promote products derived from
18
 *    this software without specific prior written permission.
19
 *
20
 * Alternatively, this software may be distributed under the terms of the
21
 * GNU General Public License ("GPL") version 2 as published by the Free
22
 * Software Foundation.
23
 *
24
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
 * POSSIBILITY OF SUCH DAMAGE.
35
 */
36
 
37
#ifndef _TIPC_REF_H
38
#define _TIPC_REF_H
39
 
40
/**
41
 * struct reference - TIPC object reference entry
42
 * @object: pointer to object associated with reference entry
43
 * @lock: spinlock controlling access to object
44
 * @data: reference value associated with object (or link to next unused entry)
45
 */
46
 
47
struct reference {
48
        void *object;
49
        spinlock_t lock;
50
        union {
51
                u32 next_plus_upper;
52
                u32 reference;
53
        } data;
54
};
55
 
56
/**
57
 * struct tipc_ref_table - table of TIPC object reference entries
58
 * @entries: pointer to array of reference entries
59
 * @index_mask: bitmask for array index portion of reference values
60
 * @first_free: array index of first unused object reference entry
61
 * @last_free: array index of last unused object reference entry
62
 */
63
 
64
struct ref_table {
65
        struct reference *entries;
66
        u32 index_mask;
67
        u32 first_free;
68
        u32 last_free;
69
};
70
 
71
extern struct ref_table tipc_ref_table;
72
 
73
int tipc_ref_table_init(u32 requested_size, u32 start);
74
void tipc_ref_table_stop(void);
75
 
76
u32 tipc_ref_acquire(void *object, spinlock_t **lock);
77
void tipc_ref_discard(u32 ref);
78
 
79
 
80
/**
81
 * tipc_ref_lock - lock referenced object and return pointer to it
82
 */
83
 
84
static inline void *tipc_ref_lock(u32 ref)
85
{
86
        if (likely(tipc_ref_table.entries)) {
87
                struct reference *r =
88
                        &tipc_ref_table.entries[ref & tipc_ref_table.index_mask];
89
 
90
                spin_lock_bh(&r->lock);
91
                if (likely(r->data.reference == ref))
92
                        return r->object;
93
                spin_unlock_bh(&r->lock);
94
        }
95
        return NULL;
96
}
97
 
98
/**
99
 * tipc_ref_unlock - unlock referenced object
100
 */
101
 
102
static inline void tipc_ref_unlock(u32 ref)
103
{
104
        if (likely(tipc_ref_table.entries)) {
105
                struct reference *r =
106
                        &tipc_ref_table.entries[ref & tipc_ref_table.index_mask];
107
 
108
                if (likely(r->data.reference == ref))
109
                        spin_unlock_bh(&r->lock);
110
                else
111
                        err("tipc_ref_unlock() invoked using obsolete reference\n");
112
        }
113
}
114
 
115
/**
116
 * tipc_ref_deref - return pointer referenced object (without locking it)
117
 */
118
 
119
static inline void *tipc_ref_deref(u32 ref)
120
{
121
        if (likely(tipc_ref_table.entries)) {
122
                struct reference *r =
123
                        &tipc_ref_table.entries[ref & tipc_ref_table.index_mask];
124
 
125
                if (likely(r->data.reference == ref))
126
                        return r->object;
127
        }
128
        return NULL;
129
}
130
 
131
#endif

powered by: WebSVN 2.1.0

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