orx 1.17
Portable Game Engine
Loading...
Searching...
No Matches
orxMemory.h
Go to the documentation of this file.
1/* Orx - Portable Game Engine
2 *
3 * Copyright (c) 2008- Orx-Project
4 *
5 * This software is provided 'as-is', without any express or implied
6 * warranty. In no event will the authors be held liable for any damages
7 * arising from the use of this software.
8 *
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 *
13 * 1. The origin of this software must not be misrepresented; you must not
14 * claim that you wrote the original software. If you use this software
15 * in a product, an acknowledgment in the product documentation would be
16 * appreciated but is not required.
17 *
18 * 2. Altered source versions must be plainly marked as such, and must not be
19 * misrepresented as being the original software.
20 *
21 * 3. This notice may not be removed or altered from any source
22 * distribution.
23 */
24
34
43
44
45#ifndef _orxMEMORY_H_
46#define _orxMEMORY_H_
47
48
49#include "orxInclude.h"
50#include "debug/orxDebug.h"
51
52#include <string.h>
53
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"
66 #endif /* __orxGCC__ */
67#elif defined(__orxMSVC__)
68 #ifdef __orx64__
69 #define orxMEMORY_BARRIER() __faststorefence()
70 #else /* __orx64__ */
71 #define orxMEMORY_BARRIER() \
72 { \
73 long lBarrier; \
74 _InterlockedOr(&lBarrier, 0); \
75 }
76 #endif /* __orx64__ */
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
83#else
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
90 #undef orxHAS_ATOMICS
91
92 #warning !!WARNING!! This compiler does not have any builtin hardware memory barrier nor atomics.
93#endif
94
95
97#ifdef __orxPROFILER__
98 #define orxMEMORY_TRACK(TYPE, SIZE, ALLOCATE) orxMemory_Track(orxMEMORY_TYPE_##TYPE, SIZE, ALLOCATE)
99#else /* __orxPROFILER__ */
100 #define orxMEMORY_TRACK(TYPE, SIZE, ALLOCATE)
101#endif /* __orxPROFILER__ */
102
103
105#if !defined(__orxWINDOWS__)
106 #include <alloca.h>
107#endif /* !__orxWINDOWS__ */
108#define orxMemory_StackAllocate(x) alloca((x))
109
110
130
131
134extern orxDLLAPI void orxFASTCALL orxMemory_Setup();
135
139extern orxDLLAPI orxSTATUS orxFASTCALL orxMemory_Init();
140
143extern orxDLLAPI void orxFASTCALL orxMemory_Exit();
144
149
152extern orxDLLAPI void orxFASTCALL orxMemory_ExitThread();
153
159extern orxDLLAPI void *orxFASTCALL orxMemory_Allocate(orxU32 _u32Size, orxMEMORY_TYPE _eMemType);
160
169extern orxDLLAPI void *orxFASTCALL orxMemory_Reallocate(void *_pMem, orxU32 _u32Size, orxMEMORY_TYPE _eMemType);
170
174extern orxDLLAPI void orxFASTCALL orxMemory_Free(void *_pMem);
175
176
184static orxINLINE void * orxMemory_Copy(void *_pDest, const void *_pSrc, orxU32 _u32Size)
185{
186 /* Checks */
187 orxASSERT(_pDest != orxNULL);
188 orxASSERT(_pSrc != orxNULL);
189
190 /* Done! */
191 return((void *)memcpy(_pDest, _pSrc, (size_t)_u32Size));
192}
193
200static orxINLINE void * orxMemory_Move(void *_pDest, const void *_pSrc, orxU32 _u32Size)
201{
202 /* Checks */
203 orxASSERT(_pDest != orxNULL);
204 orxASSERT(_pSrc != orxNULL);
205
206 /* Done! */
207 return((void *)memmove(_pDest, _pSrc, (size_t)_u32Size));
208}
209
216static orxINLINE orxU32 orxMemory_Compare(const void *_pMem1, const void *_pMem2, orxU32 _u32Size)
217{
218 /* Checks */
219 orxASSERT(_pMem1 != orxNULL);
220 orxASSERT(_pMem2 != orxNULL);
221
222 /* Done! */
223 return((orxU32)memcmp(_pMem1, _pMem2, (size_t)_u32Size));
224}
225
232static orxINLINE void * orxMemory_Set(void *_pDest, orxU8 _u8Data, orxU32 _u32Size)
233{
234 /* Checks */
235 orxASSERT(_pDest != orxNULL);
236
237 /* Done! */
238 return((void *)memset(_pDest, _u8Data, (size_t)_u32Size));
239}
240
246static orxINLINE void * orxMemory_Zero(void *_pDest, orxU32 _u32Size)
247{
248 /* Checks */
249 orxASSERT(_pDest != orxNULL);
250
251 /* Done! */
252 return((void *)memset(_pDest, 0, (size_t)_u32Size));
253}
254
255
260extern orxDLLAPI const orxSTRING orxFASTCALL orxMemory_GetTypeName(orxMEMORY_TYPE _eMemType);
261
262
266extern orxDLLAPI orxU32 orxFASTCALL orxMemory_GetCacheLineSize();
267
268
269#ifdef __orxPROFILER__
270
280extern orxDLLAPI orxSTATUS orxFASTCALL orxMemory_GetUsage(orxMEMORY_TYPE _eMemType, orxU64 *_pu64Count, orxU64 *_pu64PeakCount, orxU64 *_pu64Size, orxU64 *_pu64PeakSize, orxU64 *_pu64OperationCount);
281
282
289extern orxDLLAPI orxSTATUS orxFASTCALL orxMemory_Track(orxMEMORY_TYPE _eMemType, orxU32 _u32Size, orxBOOL _bAllocate);
290
291#endif /* __orxPROFILER__ */
292
293#if defined(__orxGCC__)
294 #pragma GCC diagnostic pop
295#endif /* __orxGCC__ */
296
297#endif /* _orxMEMORY_H_ */
298
#define orxASSERT(TEST,...)
Definition orxDebug.h:378
#define orxDLLAPI
Definition orxDecl.h:381
static orxINLINE orxU32 orxMemory_Compare(const void *_pMem1, const void *_pMem2, orxU32 _u32Size)
Definition orxMemory.h:216
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)
Definition orxMemory.h:200
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)
Definition orxMemory.h:232
orxDLLAPI void *orxFASTCALL orxMemory_Reallocate(void *_pMem, orxU32 _u32Size, orxMEMORY_TYPE _eMemType)
orxDLLAPI orxSTATUS orxFASTCALL orxMemory_Init()
orxMEMORY_TYPE
Definition orxMemory.h:114
static orxINLINE void * orxMemory_Zero(void *_pDest, orxU32 _u32Size)
Definition orxMemory.h:246
static orxINLINE void * orxMemory_Copy(void *_pDest, const void *_pSrc, orxU32 _u32Size)
Definition orxMemory.h:184
orxDLLAPI void orxFASTCALL orxMemory_Setup()
orxDLLAPI void *orxFASTCALL orxMemory_Allocate(orxU32 _u32Size, orxMEMORY_TYPE _eMemType)
@ orxMEMORY_TYPE_PHYSICS
Definition orxMemory.h:119
@ orxMEMORY_TYPE_SYSTEM
Definition orxMemory.h:120
@ orxMEMORY_TYPE_VIDEO
Definition orxMemory.h:123
@ orxMEMORY_TYPE_TEXT
Definition orxMemory.h:122
@ orxMEMORY_TYPE_MAIN
Definition orxMemory.h:115
@ orxMEMORY_TYPE_CONFIG
Definition orxMemory.h:117
@ orxMEMORY_TYPE_AUDIO
Definition orxMemory.h:116
@ orxMEMORY_TYPE_TEMP
Definition orxMemory.h:121
@ orxMEMORY_TYPE_NUMBER
Definition orxMemory.h:125
@ orxMEMORY_TYPE_NONE
Definition orxMemory.h:127
@ orxMEMORY_TYPE_DEBUG
Definition orxMemory.h:118
orxSTATUS
Definition orxType.h:270

Generated for orx by doxygen 1.8.11