tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

stdatomic.h (5680B)


      1 /*
      2 * This file is part of FFmpeg.
      3 *
      4 * FFmpeg is free software; you can redistribute it and/or
      5 * modify it under the terms of the GNU Lesser General Public
      6 * License as published by the Free Software Foundation; either
      7 * version 2.1 of the License, or (at your option) any later version.
      8 *
      9 * FFmpeg is distributed in the hope that it will be useful,
     10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12 * Lesser General Public License for more details.
     13 *
     14 * You should have received a copy of the GNU Lesser General Public
     15 * License along with FFmpeg; if not, write to the Free Software
     16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     17 */
     18 
     19 #ifndef COMPAT_ATOMICS_WIN32_STDATOMIC_H
     20 #define COMPAT_ATOMICS_WIN32_STDATOMIC_H
     21 
     22 #include <stddef.h>
     23 #include <stdint.h>
     24 #include <windows.h>
     25 
     26 #define ATOMIC_FLAG_INIT 0
     27 
     28 #define ATOMIC_VAR_INIT(value) (value)
     29 
     30 #define atomic_init(obj, value) \
     31 do {                            \
     32    *(obj) = (value);           \
     33 } while(0)
     34 
     35 #define kill_dependency(y) ((void)0)
     36 
     37 #define atomic_thread_fence(order) \
     38    MemoryBarrier();
     39 
     40 #define atomic_signal_fence(order) \
     41    ((void)0)
     42 
     43 #define atomic_is_lock_free(obj) 0
     44 
     45 typedef intptr_t atomic_flag;
     46 typedef intptr_t atomic_bool;
     47 typedef intptr_t atomic_char;
     48 typedef intptr_t atomic_schar;
     49 typedef intptr_t atomic_uchar;
     50 typedef intptr_t atomic_short;
     51 typedef intptr_t atomic_ushort;
     52 typedef intptr_t atomic_int;
     53 typedef intptr_t atomic_uint;
     54 typedef intptr_t atomic_long;
     55 typedef intptr_t atomic_ulong;
     56 typedef intptr_t atomic_llong;
     57 typedef intptr_t atomic_ullong;
     58 typedef intptr_t atomic_wchar_t;
     59 typedef intptr_t atomic_int_least8_t;
     60 typedef intptr_t atomic_uint_least8_t;
     61 typedef intptr_t atomic_int_least16_t;
     62 typedef intptr_t atomic_uint_least16_t;
     63 typedef intptr_t atomic_int_least32_t;
     64 typedef intptr_t atomic_uint_least32_t;
     65 typedef intptr_t atomic_int_least64_t;
     66 typedef intptr_t atomic_uint_least64_t;
     67 typedef intptr_t atomic_int_fast8_t;
     68 typedef intptr_t atomic_uint_fast8_t;
     69 typedef intptr_t atomic_int_fast16_t;
     70 typedef intptr_t atomic_uint_fast16_t;
     71 typedef intptr_t atomic_int_fast32_t;
     72 typedef intptr_t atomic_uint_fast32_t;
     73 typedef intptr_t atomic_int_fast64_t;
     74 typedef intptr_t atomic_uint_fast64_t;
     75 typedef intptr_t atomic_intptr_t;
     76 typedef intptr_t atomic_uintptr_t;
     77 typedef intptr_t atomic_size_t;
     78 typedef intptr_t atomic_ptrdiff_t;
     79 typedef intptr_t atomic_intmax_t;
     80 typedef intptr_t atomic_uintmax_t;
     81 
     82 #define atomic_store(object, desired)   \
     83 do {                                    \
     84    *(object) = (desired);              \
     85    MemoryBarrier();                    \
     86 } while (0)
     87 
     88 #define atomic_store_explicit(object, desired, order) \
     89    atomic_store(object, desired)
     90 
     91 #define atomic_load(object) \
     92    (MemoryBarrier(), *(object))
     93 
     94 #define atomic_load_explicit(object, order) \
     95    atomic_load(object)
     96 
     97 #define atomic_exchange(object, desired) \
     98    InterlockedExchangePointer((PVOID volatile *)object, (PVOID)desired)
     99 
    100 #define atomic_exchange_explicit(object, desired, order) \
    101    atomic_exchange(object, desired)
    102 
    103 static inline int atomic_compare_exchange_strong(intptr_t *object, intptr_t *expected,
    104                                                 intptr_t desired)
    105 {
    106    intptr_t old = *expected;
    107    *expected = (intptr_t)InterlockedCompareExchangePointer(
    108        (PVOID *)object, (PVOID)desired, (PVOID)old);
    109    return *expected == old;
    110 }
    111 
    112 #define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \
    113    atomic_compare_exchange_strong(object, expected, desired)
    114 
    115 #define atomic_compare_exchange_weak(object, expected, desired) \
    116    atomic_compare_exchange_strong(object, expected, desired)
    117 
    118 #define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \
    119    atomic_compare_exchange_weak(object, expected, desired)
    120 
    121 #ifdef _WIN64
    122 #define atomic_fetch_add(object, operand) \
    123    InterlockedExchangeAdd64(object, operand)
    124 
    125 #define atomic_fetch_sub(object, operand) \
    126    InterlockedExchangeAdd64(object, -(operand))
    127 
    128 #define atomic_fetch_or(object, operand) \
    129    InterlockedOr64(object, operand)
    130 
    131 #define atomic_fetch_xor(object, operand) \
    132    InterlockedXor64(object, operand)
    133 
    134 #define atomic_fetch_and(object, operand) \
    135    InterlockedAnd64(object, operand)
    136 #else
    137 #define atomic_fetch_add(object, operand) \
    138    InterlockedExchangeAdd(object, operand)
    139 
    140 #define atomic_fetch_sub(object, operand) \
    141    InterlockedExchangeAdd(object, -(operand))
    142 
    143 #define atomic_fetch_or(object, operand) \
    144    InterlockedOr(object, operand)
    145 
    146 #define atomic_fetch_xor(object, operand) \
    147    InterlockedXor(object, operand)
    148 
    149 #define atomic_fetch_and(object, operand) \
    150    InterlockedAnd(object, operand)
    151 #endif /* _WIN64 */
    152 
    153 #define atomic_fetch_add_explicit(object, operand, order) \
    154    atomic_fetch_add(object, operand)
    155 
    156 #define atomic_fetch_sub_explicit(object, operand, order) \
    157    atomic_fetch_sub(object, operand)
    158 
    159 #define atomic_fetch_or_explicit(object, operand, order) \
    160    atomic_fetch_or(object, operand)
    161 
    162 #define atomic_fetch_xor_explicit(object, operand, order) \
    163    atomic_fetch_xor(object, operand)
    164 
    165 #define atomic_fetch_and_explicit(object, operand, order) \
    166    atomic_fetch_and(object, operand)
    167 
    168 #define atomic_flag_test_and_set(object) \
    169    atomic_exchange(object, 1)
    170 
    171 #define atomic_flag_test_and_set_explicit(object, order) \
    172    atomic_flag_test_and_set(object)
    173 
    174 #define atomic_flag_clear(object) \
    175    atomic_store(object, 0)
    176 
    177 #define atomic_flag_clear_explicit(object, order) \
    178    atomic_flag_clear(object)
    179 
    180 #endif /* COMPAT_ATOMICS_WIN32_STDATOMIC_H */