Ignore:
Timestamp:
2007-06-08T15:02:49Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c03ee1c
Parents:
3ee8a075
Message:

Merge arm32 into trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/libc/arch/arm32/include/atomic.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2005 Jakub Jermar
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3131 */
    3232/** @file
     33 *  @brief Atomic operations.
    3334 */
    3435
     
    3839/** Atomic addition.
    3940 *
    40  * @param val Atomic value.
    41  * @param imm Value to add.
     41 * @param val Where to add.
     42 * @param i   Value to be added.
    4243 *
    4344 * @return Value after addition.
    4445 */
    45 static inline long atomic_add(atomic_t *val, int imm)
     46static inline long atomic_add(atomic_t *val, int i)
    4647{
    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;
    4966}
    5067
     68
     69/** Atomic increment.
     70 *
     71 * @param val Variable to be incremented.
     72 */
    5173static 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 */
    5280static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); }
    5381
    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; }
    5682
    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 */
     88static 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 */
     96static 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 */
     104static 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 */
     112static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1) + 1; }
     113
    59114
    60115#endif
Note: See TracChangeset for help on using the changeset viewer.