55#if defined(__orxGCC__) || defined(__orxLLVM__) || defined(__orxWEB__)
56 #define orxMEMORY_BARRIER() __sync_synchronize()
57 #define orxHAS_MEMORY_BARRIER
58 #define orxMEMORY_ATOMIC_INC32(ADDRESS) __atomic_add_fetch((ADDRESS), 1, __ATOMIC_SEQ_CST)
59 #define orxMEMORY_ATOMIC_DEC32(ADDRESS) __atomic_sub_fetch((ADDRESS), 1, __ATOMIC_SEQ_CST)
60 #define orxMEMORY_ATOMIC_INC64(ADDRESS) __atomic_add_fetch((ADDRESS), 1, __ATOMIC_SEQ_CST)
61 #define orxMEMORY_ATOMIC_DEC64(ADDRESS) __atomic_sub_fetch((ADDRESS), 1, __ATOMIC_SEQ_CST)
62 #define orxHAS_ATOMICS
63 #if defined(__orxGCC__)
64 #pragma GCC diagnostic push
65 #pragma GCC diagnostic ignored "-Wstringop-overflow"
67#elif defined(__orxMSVC__)
69 #define orxMEMORY_BARRIER() __faststorefence()
71 #define orxMEMORY_BARRIER() \
74 _InterlockedOr(&lBarrier, 0); \
77 #define orxHAS_MEMORY_BARRIER
78 #define orxMEMORY_ATOMIC_INC32(ADDRESS) ((orxU32)_InterlockedIncrement((volatile long *)(ADDRESS)))
79 #define orxMEMORY_ATOMIC_DEC32(ADDRESS) ((orxU32)_InterlockedDecrement((volatile long *)(ADDRESS)))
80 #define orxMEMORY_ATOMIC_INC64(ADDRESS) ((orxU64)_InterlockedIncrement64((volatile __int64 *)(ADDRESS)))
81 #define orxMEMORY_ATOMIC_DEC64(ADDRESS) ((orxU64)_InterlockedDecrement64((volatile __int64 *)(ADDRESS)))
82 #define orxHAS_ATOMICS
84 #define orxMEMORY_BARRIER()
85 #define orxMEMORY_ATOMIC_INC32(ADDRESS) (++(*(ADDRESS)))
86 #define orxMEMORY_ATOMIC_DEC32(ADDRESS) (--(*(ADDRESS)))
87 #define orxMEMORY_ATOMIC_INC64(ADDRESS) (++(*(ADDRESS)))
88 #define orxMEMORY_ATOMIC_DEC64(ADDRESS) (--(*(ADDRESS)))
89 #undef orxHAS_MEMORY_BARRIER
92 #warning !!WARNING!! This compiler does not have any builtin hardware memory barrier nor atomics.
98 #define orxMEMORY_TRACK(TYPE, SIZE, ALLOCATE) orxMemory_Track(orxMEMORY_TYPE_##TYPE, SIZE, ALLOCATE)
100 #define orxMEMORY_TRACK(TYPE, SIZE, ALLOCATE)
105#if !defined(__orxWINDOWS__)
108#define orxMemory_StackAllocate(x) alloca((x))
113typedef enum __orxMEMORY_TYPE_t
184static orxINLINE
void *
orxMemory_Copy(
void *_pDest,
const void *_pSrc, orxU32 _u32Size)
191 return((
void *)memcpy(_pDest, _pSrc, (
size_t)_u32Size));
200static orxINLINE
void *
orxMemory_Move(
void *_pDest,
const void *_pSrc, orxU32 _u32Size)
207 return((
void *)memmove(_pDest, _pSrc, (
size_t)_u32Size));
216static orxINLINE orxU32
orxMemory_Compare(
const void *_pMem1,
const void *_pMem2, orxU32 _u32Size)
223 return((orxU32)memcmp(_pMem1, _pMem2, (
size_t)_u32Size));
232static orxINLINE
void *
orxMemory_Set(
void *_pDest, orxU8 _u8Data, orxU32 _u32Size)
238 return((
void *)memset(_pDest, _u8Data, (
size_t)_u32Size));
252 return((
void *)memset(_pDest, 0, (
size_t)_u32Size));
269#ifdef __orxPROFILER__
280extern orxDLLAPI orxSTATUS orxFASTCALL orxMemory_GetUsage(
orxMEMORY_TYPE _eMemType, orxU64 *_pu64Count, orxU64 *_pu64PeakCount, orxU64 *_pu64Size, orxU64 *_pu64PeakSize, orxU64 *_pu64OperationCount);
293#if defined(__orxGCC__)
294 #pragma GCC diagnostic pop
#define orxASSERT(TEST,...)
static orxINLINE orxU32 orxMemory_Compare(const void *_pMem1, const void *_pMem2, orxU32 _u32Size)
orxDLLAPI orxSTATUS orxFASTCALL orxMemory_InitThread()
orxDLLAPI const orxSTRING orxFASTCALL orxMemory_GetTypeName(orxMEMORY_TYPE _eMemType)
orxDLLAPI void orxFASTCALL orxMemory_ExitThread()
static orxINLINE void * orxMemory_Move(void *_pDest, const void *_pSrc, orxU32 _u32Size)
orxDLLAPI void orxFASTCALL orxMemory_Free(void *_pMem)
orxDLLAPI void orxFASTCALL orxMemory_Exit()
orxDLLAPI orxU32 orxFASTCALL orxMemory_GetCacheLineSize()
static orxINLINE void * orxMemory_Set(void *_pDest, orxU8 _u8Data, orxU32 _u32Size)
orxDLLAPI void *orxFASTCALL orxMemory_Reallocate(void *_pMem, orxU32 _u32Size, orxMEMORY_TYPE _eMemType)
orxDLLAPI orxSTATUS orxFASTCALL orxMemory_Init()
static orxINLINE void * orxMemory_Zero(void *_pDest, orxU32 _u32Size)
static orxINLINE void * orxMemory_Copy(void *_pDest, const void *_pSrc, orxU32 _u32Size)
orxDLLAPI void orxFASTCALL orxMemory_Setup()
orxDLLAPI void *orxFASTCALL orxMemory_Allocate(orxU32 _u32Size, orxMEMORY_TYPE _eMemType)