Atomic-c-api.h
2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#pragma once
#include "il2cpp-config-platforms.h"
#include <stdint.h>
#include "Baselib.h"
#include "C/Baselib_Atomic_TypeSafe.h"
inline void UnityPalFullMemoryBarrier()
{
Baselib_atomic_thread_fence_seq_cst();
}
inline int32_t UnityPalAdd(int32_t* location1, int32_t value)
{
return Baselib_atomic_fetch_add_32_seq_cst(location1, value) + value;
}
#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
inline int64_t UnityPalAdd64(int64_t* location1, int64_t value)
{
return Baselib_atomic_fetch_add_64_seq_cst(location1, value) + value;
}
#endif
inline int32_t UnityPalIncrement(int32_t* value)
{
return Baselib_atomic_fetch_add_32_seq_cst(value, 1) + 1;
}
#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
inline int64_t UnityPalIncrement64(int64_t* value)
{
return Baselib_atomic_fetch_add_64_seq_cst(value, 1) + 1;
}
#endif
inline int32_t UnityPalDecrement(int32_t* value)
{
return Baselib_atomic_fetch_add_32_seq_cst(value, -1) - 1;
}
#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
inline int64_t UnityPalDecrement64(int64_t* value)
{
return Baselib_atomic_fetch_add_64_seq_cst(value, -1) - 1;
}
#endif
inline int32_t UnityPalCompareExchange(int32_t* dest, int32_t exchange, int32_t comparand)
{
Baselib_atomic_compare_exchange_strong_32_seq_cst_seq_cst(dest, &comparand, exchange);
return comparand;
}
inline int64_t UnityPalCompareExchange64(int64_t* dest, int64_t exchange, int64_t comparand)
{
Baselib_atomic_compare_exchange_strong_64_seq_cst_seq_cst(dest, &comparand, exchange);
return comparand;
}
inline void* UnityPalCompareExchangePointer(void* volatile* dest, void* exchange, void* comparand)
{
Baselib_atomic_compare_exchange_strong_ptr_seq_cst_seq_cst((intptr_t*)dest, (intptr_t*)&comparand, (intptr_t)exchange);
return comparand;
}
inline int32_t UnityPalExchange(int32_t* dest, int32_t exchange)
{
return Baselib_atomic_exchange_32_seq_cst(dest, exchange);
}
#if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
inline int64_t UnityPalExchange64(int64_t* dest, int64_t exchange)
{
return Baselib_atomic_exchange_64_seq_cst(dest, exchange);
}
#endif
inline void* UnityPalExchangePointer(void* volatile* dest, void* exchange)
{
return (void*)Baselib_atomic_exchange_ptr_seq_cst((intptr_t*)dest, (intptr_t)exchange);
}
inline int64_t UnityPalRead64(int64_t* addr)
{
return Baselib_atomic_fetch_add_64_seq_cst(addr, 0);
}
inline intptr_t UnityPalReadPtrVal(intptr_t* addr)
{
return Baselib_atomic_fetch_add_ptr_seq_cst(addr, 0);
}