XBinder  Version 2.8.x
rtxMemory.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2003-2022 Objective Systems, Inc.
3  *
4  * This software is furnished under a license and may be used and copied
5  * only in accordance with the terms of such license and with the
6  * inclusion of the above copyright notice. This software or any other
7  * copies thereof may not be provided or otherwise made available to any
8  * other person. No title to and ownership of the software is hereby
9  * transferred.
10  *
11  * The information in this software is subject to change without notice
12  * and should not be construed as a commitment by Objective Systems, Inc.
13  *
14  * PROPRIETARY NOTICE
15  *
16  * This software is an unpublished work subject to a confidentiality agreement
17  * and is protected by copyright and trade secret law. Unauthorized copying,
18  * redistribution or other use of this work is prohibited.
19  *
20  * The above notice of copyright on this source code product does not indicate
21  * any actual or intended publication of such source code.
22  *
23  *****************************************************************************/
28 #ifndef __RTXMEMORY_H__
29 #define __RTXMEMORY_H__
30 
31 #include "rtxsrc/rtxContext.h"
32 
33 /*
34  * Uncomment this definition before building the C or C++ run-time
35  * libraries to enable compact memory management. This will have a
36  * smaller code footprint than the standard memory management, however,
37  * the performance may not be as good.
38  */
39 /*#define _MEMCOMPACT*/
40 
41 #define RT_MH_DONTKEEPFREE 0x1
42 #define RT_MH_VALIDATEPTR 0x2
43 #define RT_MH_CHECKHEAP 0x4
44 #define RT_MH_TRACE 0x8
45 #define RT_MH_DIAG 0x10
46 #define RT_MH_DIAG_DEBUG 0x20
47 #define RT_MH_ZEROONFREE 0x40
48 #define RT_MH_ZEROARRAY 0x80
49 #define RT_MH_SYSALLOC 0x100
50 #define RT_MH_TRACE_FREELIST 0x200 /* enable printing of the free element list
51  at certain junctures in the memory
52  management code.
53  Requires building with _MEMTRACE */
54 
55 #define OSRTMH_PROPID_DEFBLKSIZE 1
56 #define OSRTMH_PROPID_SETFLAGS 2
57 #define OSRTMH_PROPID_CLEARFLAGS 3
58 #define OSRTMH_PROPID_KEEPFREEUNITS 4
59 
60 #define OSRTMH_PROPID_USER 10
61 
62 #define OSRTXM_K_MEMBLKSIZ (4*1024)
63 
77 #define OSRTALLOCTYPE(pctxt,type) \
78 (type*) rtxMemHeapAlloc (&(pctxt)->pMemHeap, sizeof(type))
79 
86 #define OSRTALLOCTYPEZ(pctxt,type) \
87 (type*) rtxMemHeapAllocZ (&(pctxt)->pMemHeap, sizeof(type))
88 
100 #define OSRTREALLOCARRAY(pctxt,pseqof,type) do {\
101 if (sizeof(type)*(pseqof)->n < (pseqof)->n) return RTERR_NOMEM; \
102 if (((pseqof)->elem = (type*) rtxMemHeapRealloc \
103 (&(pctxt)->pMemHeap, (pseqof)->elem, sizeof(type)*(pseqof)->n)) == 0) \
104 return RTERR_NOMEM; \
105 } while (0)
106 
107 #ifndef _NO_MALLOC
108 #define OSCRTMALLOC0(nbytes) malloc(nbytes)
109 #define OSCRTFREE0(ptr) free(ptr)
110 #else
111 
112 #ifdef _NO_THREADS
113 extern EXTERNRT OSCTXT g_ctxt;
114 
115 #define OSCRTMALLOC0(nbytes) rtxMemAlloc(&g_ctxt,(nbytes))
116 #define OSCRTFREE0(ptr) rtxMemFreePtr(&g_ctxt,(ptr))
117 #else
118 #define OSCRTMALLOC0(nbytes) (void*)0
119 #define OSCRTFREE0(ptr) (void*)0
120 
121 #endif /* _NO_THREADS */
122 #endif /* _NO_MALLOC */
123 
124 #define OSCRTMALLOC rtxMemAlloc
125 #define OSCRTFREE rtxMemFreePtr
126 
127 struct OSRTDList;
128 
129 #ifdef __cplusplus
130 extern "C" {
131 #endif
132 
133 /* Alias for __cdecl modifier; if __cdecl keyword is not supported,
134  * redefine it as empty macro. */
135 
136 #if !defined(OSCDECL)
137 #if defined(_MSC_VER) || defined(__BORLANDC__)
138 #define OSCDECL __cdecl
139 #else
140 #define OSCDECL
141 #endif
142 #endif /* OSCDECL */
143 
144 EXTERNRT void rtxMemHeapAddRef (void** ppvMemHeap);
145 EXTERNRT void* rtxMemHeapAlloc (void** ppvMemHeap, OSSIZE nbytes);
146 EXTERNRT void* rtxMemHeapAllocZ (void** ppvMemHeap, OSSIZE nbytes);
147 EXTERNRT void* rtxMemHeapSysAlloc (void** ppvMemHeap, OSSIZE nbytes);
148 EXTERNRT void* rtxMemHeapSysAllocZ (void** ppvMemHeap, OSSIZE nbytes);
149 EXTERNRT int rtxMemHeapCheckPtr (void** ppvMemHeap, const void* mem_p);
150 EXTERNRT void rtxMemHeapFreeAll (void** ppvMemHeap);
151 EXTERNRT void rtxMemHeapFreePtr (void** ppvMemHeap, void* mem_p);
152 EXTERNRT void rtxMemHeapSysFreePtr (void** ppvMemHeap, void* mem_p);
153 
154 /* Internal runtime use only.
155  This can only be used with a static memory heap.
156  It will reallocate the last memory block if the given block of the
157  given size appears right at the end of the static memory heap.
158  @param ppvMemHeap the heap
159  @param mem_p Pointer to block to resize
160  @param oldsize The previously allocated size of the block.
161  @param newsize The desired new size of the block.
162 */
163 EXTERNRT void* rtxMemHeapReallocStatic
164 (void** ppvMemHeap, void* mem_p, OSSIZE oldsize, OSSIZE newsize);
165 
166 EXTERNRT void* rtxMemHeapRealloc
167 (void** ppvMemHeap, void* mem_p, OSSIZE nbytes_);
168 
169 EXTERNRT void* rtxMemHeapSysRealloc
170 (void** ppvMemHeap, void* mem_p, OSSIZE nbytes_);
171 
172 EXTERNRT void rtxMemHeapRelease (void** ppvMemHeap);
173 EXTERNRT void rtxMemHeapReset (void** ppvMemHeap);
174 EXTERNRT void rtxMemHeapSetProperty (void** ppvMemHeap,
175  OSUINT32 propId, void* pProp);
176 
177 EXTERNRT void* rtxMemNewArray (OSSIZE nbytes);
178 EXTERNRT void* rtxMemNewArrayZ (OSSIZE nbytes);
179 EXTERNRT void rtxMemDeleteArray (void* mem_p);
180 
181 EXTERNRT void* rtxMemHeapAutoPtrRef (void** ppvMemHeap, void* ptr);
182 EXTERNRT int rtxMemHeapAutoPtrUnref (void** ppvMemHeap, void* ptr);
183 EXTERNRT int rtxMemHeapAutoPtrGetRefCount (void** ppvMemHeap, void* mem_p);
184 
185 EXTERNRT void rtxMemHeapInvalidPtrHook (void** ppvMemHeap, const void* mem_p);
186 
187 EXTERNRT void rtxMemHeapCheck (void **ppvMemHeap, const char* file, int line);
188 
192 EXTERNRT void rtxMemHeapPrint (void **ppvMemHeap);
193 
198 EXTERNRT void rtxMemHeapPrintWithFree (void **ppvMemHeap);
199 
208 EXTERNRT int rtxMemHeapCreate (void** ppvMemHeap);
209 
222 EXTERNRT int rtxMemHeapCreateExt (void** ppvMemHeap,
223  OSMallocFunc malloc_func,
224  OSReallocFunc realloc_func,
225  OSFreeFunc free_func);
226 
240 EXTERNRT int rtxMemStaticHeapCreate
241 (void **ppvMemHeap, void* pmem, OSSIZE memsize) ;
242 
243 #if !defined(_ARMTCC) && !defined(__SYMBIAN32__)
244 
259 EXTERNRT void rtxMemSetAllocFuncs (OSMallocFunc malloc_func,
260  OSReallocFunc realloc_func,
261  OSFreeFunc free_func);
262 
263 #endif /* __SYMBIAN32__ */
264 
265 EXTERNRT void rtxMemFreeOpenSeqExt
266 (OSCTXT* pctxt, struct OSRTDList *pElemList);
267 
274 EXTERNRT OSUINT32 rtxMemHeapGetDefBlkSize (OSCTXT* pctxt);
275 
276 #ifndef __SYMBIAN32__
277 
284 EXTERNRT void rtxMemSetDefBlkSize (OSUINT32 blkSize);
285 #endif
286 
293 EXTERNRT OSUINT32 rtxMemGetDefBlkSize (OSVOIDARG);
294 
302 EXTERNRT OSBOOL rtxMemHeapIsEmpty (OSCTXT* pctxt);
303 
312 EXTERNRT OSBOOL rtxMemIsZero (const void* pmem, OSSIZE memsiz);
313 
314 #ifdef _STATIC_HEAP
315 EXTERNRT void rtxMemSetStaticBuf (void* memHeapBuf, OSUINT32 blkSize);
316 #endif
317 
327 #define rtxMemAlloc(pctxt,nbytes) \
328 rtxMemHeapAlloc(&(pctxt)->pMemHeap,nbytes)
329 
340 #define rtxMemSysAlloc(pctxt,nbytes) \
341 rtxMemHeapSysAlloc(&(pctxt)->pMemHeap,nbytes)
342 
352 #define rtxMemAllocZ(pctxt,nbytes) \
353 rtxMemHeapAllocZ(&(pctxt)->pMemHeap,nbytes)
354 
368 #define rtxMemSysAllocZ(pctxt,nbytes) \
369 rtxMemHeapSysAllocZ(&(pctxt)->pMemHeap,nbytes)
370 
371 
386 #define rtxMemRealloc(pctxt,mem_p,nbytes) \
387 rtxMemHeapRealloc(&(pctxt)->pMemHeap, (void*)mem_p, nbytes)
388 
405 #define rtxMemSysRealloc(pctxt,mem_p,nbytes) \
406  rtxMemHeapSysRealloc(&(pctxt)->pMemHeap,(void*)mem_p,nbytes)
407 
419 #define rtxMemFreePtr(pctxt,mem_p) \
420 rtxMemHeapFreePtr(&(pctxt)->pMemHeap, (void*)mem_p)
421 
432 #define rtxMemSysFreePtr(pctxt,mem_p) \
433 rtxMemHeapSysFreePtr(&(pctxt)->pMemHeap, (void*)mem_p)
434 
443 EXTERNRT void rtxMemFree (OSCTXT* pctxt);
444 
459 EXTERNRT void rtxMemReset (OSCTXT* pctxt);
460 
470 #define rtxMemAllocType(pctxt,ctype) \
471 (ctype*)rtxMemHeapAlloc(&(pctxt)->pMemHeap,sizeof(ctype))
472 
486 #define rtxMemSysAllocType(pctxt,ctype) \
487 (ctype*)rtxMemHeapSysAlloc(&(pctxt)->pMemHeap,sizeof(ctype))
488 
498 #define rtxMemAllocTypeZ(pctxt,ctype) \
499 (ctype*)rtxMemHeapAllocZ(&(pctxt)->pMemHeap,sizeof(ctype))
500 
514 #define rtxMemSysAllocTypeZ(pctxt,ctype) \
515 (ctype*)rtxMemHeapSysAllocZ(&(pctxt)->pMemHeap,sizeof(ctype))
516 
528 #define rtxMemFreeType(pctxt,mem_p) \
529 rtxMemHeapFreePtr(&(pctxt)->pMemHeap, (void*)mem_p)
530 
542 #define rtxMemSysFreeType(pctxt,mem_p) \
543 rtxMemHeapSysFreePtr(&(pctxt)->pMemHeap, (void*)mem_p)
544 
554 #define rtxMemAllocArray(pctxt,n,type) \
555 (type*)rtxMemAllocArray2 (pctxt, n, sizeof(type), 0)
556 
557 EXTERNRT void* rtxMemAllocArray2
558 (OSCTXT* pctxt, OSSIZE numElements, OSSIZE typeSize, OSUINT32 flags);
559 
573 #define rtxMemSysAllocArray(pctxt,n,type) \
574 (type*)rtxMemAllocArray2 (pctxt, n, sizeof(type), RT_MH_SYSALLOC)
575 
585 #define rtxMemAllocArrayZ(pctxt,n,type) \
586 (type*)rtxMemAllocArray2 (pctxt, n, sizeof(type), RT_MH_ZEROARRAY)
587 
599 #define rtxMemFreeArray(pctxt,mem_p) \
600 rtxMemHeapFreePtr(&(pctxt)->pMemHeap, (void*)mem_p)
601 
613 #define rtxMemSysFreeArray(pctxt,mem_p) \
614 rtxMemHeapSysFreePtr(&(pctxt)->pMemHeap, (void*)mem_p)
615 
630 #define rtxMemReallocArray(pctxt,mem_p,n,type) \
631 (type*)rtxMemHeapRealloc(&(pctxt)->pMemHeap, (void*)mem_p, sizeof(type)*n)
632 
633 /* Auto-pointer functions */
646 #define rtxMemNewAutoPtr(pctxt,nbytes) \
647 rtxMemHeapAlloc(&(pctxt)->pMemHeap, nbytes)
648 
657 #define rtxMemAutoPtrRef(pctxt,ptr) \
658 rtxMemHeapAutoPtrRef(&(pctxt)->pMemHeap, (void*)(ptr))
659 
670 #define rtxMemAutoPtrUnref(pctxt,ptr) \
671 rtxMemHeapAutoPtrUnref(&(pctxt)->pMemHeap, (void*)(ptr))
672 
681 #define rtxMemAutoPtrGetRefCount(pctxt,ptr) \
682 rtxMemHeapAutoPtrGetRefCount(&(pctxt)->pMemHeap, (void*)(ptr))
683 
692 #define rtxMemCheckPtr(pctxt,mem_p) \
693 rtxMemHeapCheckPtr(&(pctxt)->pMemHeap, (void*)mem_p)
694 
700 #define rtxMemCheck(pctxt) \
701 rtxMemHeapCheck(&(pctxt)->pMemHeap, __FILE__, __LINE__)
702 
708 #define rtxMemPrint(pctxt) \
709 rtxMemHeapPrint(&(pctxt)->pMemHeap)
710 
717 #define rtxMemPrintWithFree(pctxt) \
718 rtxMemHeapPrintWithFree(&(pctxt)->pMemHeap)
719 
727 #define rtxMemSetProperty(pctxt,propId,pProp) \
728 rtxMemHeapSetProperty (&(pctxt)->pMemHeap, propId, pProp)
729 
730 
731 #ifdef __cplusplus
732 }
733 #endif
734 
737 #endif /*__RTXMEMORY_H__*/
EXTERNRT int rtxMemStaticHeapCreate(void **ppvMemHeap, void *pmem, OSSIZE memsize)
This function creates a static memory heap.
EXTERNRT void rtxMemHeapPrintWithFree(void **ppvMemHeap)
Print the same details about the memory heap as rtxMemHeapPrint but add deatils about the free memory...
EXTERNRT OSBOOL rtxMemIsZero(const void *pmem, OSSIZE memsiz)
This helper function determines if an arbitrarily sized block of memory is set to zero...
This is the main list structure.
Definition: rtxDList.h:64
EXTERNRT OSUINT32 rtxMemHeapGetDefBlkSize(OSCTXT *pctxt)
This function returns the actual granularity of memory blocks in the context.
EXTERNRT int rtxMemHeapCreate(void **ppvMemHeap)
This function creates a standard memory heap.
Common run-time context definitions.
EXTERNRT void rtxMemFree(OSCTXT *pctxt)
Free memory associated with a context.
EXTERNRT void rtxMemSetAllocFuncs(OSMallocFunc malloc_func, OSReallocFunc realloc_func, OSFreeFunc free_func)
This function sets the pointers to standard allocation functions.
EXTERNRT int rtxMemHeapCreateExt(void **ppvMemHeap, OSMallocFunc malloc_func, OSReallocFunc realloc_func, OSFreeFunc free_func)
This function creates a standard memory heap and sets the low-level memory functions to the specified...
EXTERNRT void rtxMemHeapPrint(void **ppvMemHeap)
Print details about the memory heap.
EXTERNRT OSBOOL rtxMemHeapIsEmpty(OSCTXT *pctxt)
This function determines if the memory heap defined in the give context is empty (i.e.
EXTERNRT void rtxMemReset(OSCTXT *pctxt)
Reset memory associated with a context.
EXTERNRT void rtxMemSetDefBlkSize(OSUINT32 blkSize)
This function sets the minimum size and the granularity of memory blocks for newly created memory hea...
Run-time context structure.
Definition: rtxContext.h:198
EXTERNRT OSUINT32 rtxMemGetDefBlkSize(OSVOIDARG)
This function returns the actual granularity of memory blocks.