c_pal_ll/linux/linux_reals/real_interlocked.h (87 lines of code) (raw):
// Copyright (c) Microsoft. All rights reserved.
#ifndef REAL_INTERLOCKED_H
#define REAL_INTERLOCKED_H
#ifdef __cplusplus
#include <cstdint>
#include <cstddef>
#else
#include <stdint.h>
#include <stddef.h>
#endif
#include "macro_utils/macro_utils.h"
#include "c_pal/interlocked.h"
#define R2(X) REGISTER_GLOBAL_MOCK_HOOK(X, real_##X);
#define REGISTER_INTERLOCKED_GLOBAL_MOCK_HOOK() \
MU_FOR_EACH_1(R2, \
interlocked_add ,\
interlocked_add_64 ,\
interlocked_and ,\
interlocked_and_16 ,\
interlocked_and_64 ,\
interlocked_and_8 ,\
interlocked_compare_exchange ,\
interlocked_compare_exchange_16 ,\
interlocked_compare_exchange_64 ,\
interlocked_compare_exchange_pointer ,\
interlocked_decrement ,\
interlocked_decrement_16 ,\
interlocked_decrement_64 ,\
interlocked_exchange ,\
interlocked_exchange_16 ,\
interlocked_exchange_64 ,\
interlocked_exchange_8 ,\
interlocked_exchange_add ,\
interlocked_exchange_add_64 ,\
interlocked_exchange_pointer ,\
interlocked_increment ,\
interlocked_increment_16 ,\
interlocked_increment_64 ,\
interlocked_or ,\
interlocked_or_16 ,\
interlocked_or_64 ,\
interlocked_or_8 ,\
interlocked_xor ,\
interlocked_xor_16 ,\
interlocked_xor_64 ,\
interlocked_xor_8 \
)
#ifdef __cplusplus
extern "C" {
#endif
int32_t real_interlocked_add(volatile_atomic int32_t* addend, int32_t value);
int64_t real_interlocked_add_64(volatile_atomic int64_t* addend, int64_t value);
int32_t real_interlocked_and(volatile_atomic int32_t* destination, int32_t value);
int16_t real_interlocked_and_16( volatile_atomic int16_t* destination, int16_t value);
int64_t real_interlocked_and_64( volatile_atomic int64_t* destination, int64_t value);
int8_t real_interlocked_and_8(volatile_atomic int8_t* destination, int8_t value);
int32_t real_interlocked_compare_exchange(volatile_atomic int32_t* destination, int32_t exchange, int32_t comperand);
#ifdef _WIN64
bool real_interlocked_compare_exchange_128(volatile_atomic int64_t* destination, int64_t exchange_high, int64_t exchange_low, int64_t* comperand_result);
#endif
int16_t real_interlocked_compare_exchange_16(volatile_atomic int16_t* destination, int16_t exchange, int16_t comperand);
int64_t real_interlocked_compare_exchange_64(volatile_atomic int64_t* destination, int64_t exchange, int64_t comperand);
void* real_interlocked_compare_exchange_pointer(void* volatile_atomic* destination, void* exchange, void* comperand);
int32_t real_interlocked_decrement(volatile_atomic int32_t* addend);
int16_t real_interlocked_decrement_16(volatile_atomic int16_t* addend);
int64_t real_interlocked_decrement_64(volatile_atomic int64_t* addend);
int32_t real_interlocked_exchange(volatile_atomic int32_t* target, int32_t value);
int16_t real_interlocked_exchange_16(volatile_atomic int16_t* target, int16_t value);
int64_t real_interlocked_exchange_64(volatile_atomic int64_t* target, int64_t value);
int8_t real_interlocked_exchange_8(volatile_atomic int8_t* target, int8_t value);
int32_t real_interlocked_exchange_add(volatile_atomic int32_t* addend, int32_t value);
int64_t real_interlocked_exchange_add_64(volatile_atomic int64_t* addend, int64_t value);
void* real_interlocked_exchange_pointer(void* volatile_atomic* target, void* value);
int32_t real_interlocked_increment(volatile_atomic int32_t* addend);
int16_t real_interlocked_increment_16(volatile_atomic int16_t* addend);
int64_t real_interlocked_increment_64(volatile_atomic int64_t* addend);
int32_t real_interlocked_or(volatile_atomic int32_t* destination, int32_t value);
int16_t real_interlocked_or_16(volatile_atomic int16_t* destination, int16_t value);
int64_t real_interlocked_or_64(volatile_atomic int64_t* destination, int64_t value);
int8_t real_interlocked_or_8(volatile_atomic int8_t* destination, int8_t value);
int32_t real_interlocked_xor(volatile_atomic int32_t* destination, int32_t value);
int16_t real_interlocked_xor_16(volatile_atomic int16_t* destination, int16_t value);
int64_t real_interlocked_xor_64(volatile_atomic int64_t* destination, int64_t value);
int8_t real_interlocked_xor_8(volatile_atomic int8_t* destination, int8_t value);
#ifdef __cplusplus
}
#endif
#endif //REAL_INTERLOCKED_H