Changeset 6b781c0 in mainline for uspace/libc/arch/arm32/include/atomic.h
- Timestamp:
- 2007-06-08T15:02:49Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c03ee1c
- Parents:
- 3ee8a075
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/libc/arch/arm32/include/atomic.h
r3ee8a075 r6b781c0 1 1 /* 2 * Copyright (c) 200 5 Jakub Jermar2 * Copyright (c) 2007 Michal Kebrt 3 3 * All rights reserved. 4 4 * … … 31 31 */ 32 32 /** @file 33 * @brief Atomic operations. 33 34 */ 34 35 … … 38 39 /** Atomic addition. 39 40 * 40 * @param val Atomic value.41 * @param i mm Value to add.41 * @param val Where to add. 42 * @param i Value to be added. 42 43 * 43 44 * @return Value after addition. 44 45 */ 45 static inline long atomic_add(atomic_t *val, int i mm)46 static inline long atomic_add(atomic_t *val, int i) 46 47 { 47 /* TODO */ 48 return (val->count += imm); 48 int ret; 49 volatile long * mem = &(val->count); 50 51 asm volatile ( 52 "1: \n" 53 "ldr r2, [%1] \n" 54 "add r3, r2, %2 \n" 55 "str r3, %0 \n" 56 "swp r3, r3, [%1] \n" 57 "cmp r3, r2 \n" 58 "bne 1b \n" 59 60 : "=m" (ret) 61 : "r" (mem), "r" (i) 62 : "r3", "r2" 63 ); 64 65 return ret; 49 66 } 50 67 68 69 /** Atomic increment. 70 * 71 * @param val Variable to be incremented. 72 */ 51 73 static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } 74 75 76 /** Atomic decrement. 77 * 78 * @param val Variable to be decremented. 79 */ 52 80 static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } 53 81 54 static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1) + 1; }55 static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1) - 1; }56 82 57 static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1); } 58 static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1); } 83 /** Atomic pre-increment. 84 * 85 * @param val Variable to be incremented. 86 * @return Value after incrementation. 87 */ 88 static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1); } 89 90 91 /** Atomic pre-decrement. 92 * 93 * @param val Variable to be decremented. 94 * @return Value after decrementation. 95 */ 96 static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1); } 97 98 99 /** Atomic post-increment. 100 * 101 * @param val Variable to be incremented. 102 * @return Value before incrementation. 103 */ 104 static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1) - 1; } 105 106 107 /** Atomic post-decrement. 108 * 109 * @param val Variable to be decremented. 110 * @return Value before decrementation. 111 */ 112 static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1) + 1; } 113 59 114 60 115 #endif
Note:
See TracChangeset
for help on using the changeset viewer.