source: mainline/uspace/lib/libc/arch/arm32/include/atomic.h@ 002252a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 002252a was 8d04f709, checked in by Jakub Jermar <jakub@…>, 16 years ago

Add dummy implementation of arm32 cas.

The arm32 uspace atomic functions are still not atomic and
some of them are still broken as before, but at least it
compiles.

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * Copyright (c) 2007 Michal Kebrt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libcarm32
30 * @{
31 */
32/** @file
33 * @brief Atomic operations.
34 */
35
36#ifndef LIBC_arm32_ATOMIC_H_
37#define LIBC_arm32_ATOMIC_H_
38
39#include <bool.h>
40
41typedef struct atomic {
42 volatile long count;
43} atomic_t;
44
45static inline void atomic_set(atomic_t *val, long i)
46{
47 val->count = i;
48}
49
50static inline long atomic_get(atomic_t *val)
51{
52 return val->count;
53}
54
55static inline bool cas(atomic_t *val, long ov, long nv)
56{
57 /* FIXME: is not atomic */
58 if (val->count == ov) {
59 val->count = nv;
60 return true;
61 }
62 return false;
63}
64
65/** Atomic addition.
66 *
67 * @param val Where to add.
68 * @param i Value to be added.
69 *
70 * @return Value after addition.
71 */
72static inline long atomic_add(atomic_t *val, int i)
73{
74 int ret;
75 volatile long * mem = &(val->count);
76
77 /* FIXME: is not atomic, is broken */
78 asm volatile (
79 "1:\n"
80 "ldr r2, [%1]\n"
81 "add r3, r2, %2\n"
82 "str r3, %0\n"
83 "swp r3, r3, [%1]\n"
84 "cmp r3, r2\n"
85 "bne 1b\n"
86
87 : "=m" (ret)
88 : "r" (mem), "r" (i)
89 : "r3", "r2"
90 );
91
92 return ret;
93}
94
95
96/** Atomic increment.
97 *
98 * @param val Variable to be incremented.
99 */
100static inline void atomic_inc(atomic_t *val)
101{
102 atomic_add(val, 1);
103}
104
105
106/** Atomic decrement.
107 *
108 * @param val Variable to be decremented.
109 */
110static inline void atomic_dec(atomic_t *val)
111{
112 atomic_add(val, -1);
113}
114
115
116/** Atomic pre-increment.
117 *
118 * @param val Variable to be incremented.
119 * @return Value after incrementation.
120 */
121static inline long atomic_preinc(atomic_t *val)
122{
123 return atomic_add(val, 1);
124}
125
126
127/** Atomic pre-decrement.
128 *
129 * @param val Variable to be decremented.
130 * @return Value after decrementation.
131 */
132static inline long atomic_predec(atomic_t *val)
133{
134 return atomic_add(val, -1);
135}
136
137
138/** Atomic post-increment.
139 *
140 * @param val Variable to be incremented.
141 * @return Value before incrementation.
142 */
143static inline long atomic_postinc(atomic_t *val)
144{
145 return atomic_add(val, 1) - 1;
146}
147
148
149/** Atomic post-decrement.
150 *
151 * @param val Variable to be decremented.
152 * @return Value before decrementation.
153 */
154static inline long atomic_postdec(atomic_t *val)
155{
156 return atomic_add(val, -1) + 1;
157}
158
159
160#endif
161
162/** @}
163 */
Note: See TracBrowser for help on using the repository browser.