Home | History | Annotate | Download | only in ports
      1 /*
      2  * Copyright 2013 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkAtomics_sync_DEFINED
      9 #define SkAtomics_sync_DEFINED
     10 
     11 /** GCC/Clang __sync based atomics. */
     12 
     13 #include <stdint.h>
     14 
     15 static inline __attribute__((always_inline)) int32_t sk_atomic_inc(int32_t* addr) {
     16     return __sync_fetch_and_add(addr, 1);
     17 }
     18 
     19 static inline __attribute__((always_inline)) int32_t sk_atomic_add(int32_t* addr, int32_t inc) {
     20     return __sync_fetch_and_add(addr, inc);
     21 }
     22 
     23 static inline __attribute__((always_inline)) int32_t sk_atomic_dec(int32_t* addr) {
     24     return __sync_fetch_and_add(addr, -1);
     25 }
     26 
     27 static inline __attribute__((always_inline)) void sk_membar_acquire__after_atomic_dec() { }
     28 
     29 static inline __attribute__((always_inline)) bool sk_atomic_cas(int32_t* addr,
     30                                                                 int32_t before,
     31                                                                 int32_t after) {
     32     return __sync_bool_compare_and_swap(addr, before, after);
     33 }
     34 
     35 static inline __attribute__((always_inline)) void* sk_atomic_cas(void** addr,
     36                                                                  void* before,
     37                                                                  void* after) {
     38     return __sync_val_compare_and_swap(addr, before, after);
     39 }
     40 
     41 static inline __attribute__((always_inline)) void sk_membar_acquire__after_atomic_conditional_inc() { }
     42 
     43 #endif
     44