* Summary: interface for the memory allocator
* Description: provides interfaces for the memory allocator,
*              including debugging capabilities.
*
* Copy: See Copyright for the status of this software.
*
* Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.

/if not defined(DEBUG_MEMORY_ALLOC__)
/define DEBUG_MEMORY_ALLOC__

/include "libxmlrpg/xmlversion"
/include "libxmlrpg/xmlTypesC"

* DEBUG_MEMORY:
*
* DEBUG_MEMORY replaces the allocator with a collect and debug
* shell to the libc allocator.
* DEBUG_MEMORY should only be activated when debugging
* libxml i.e. if libxml has been configured with --with-debug-mem too.

* /define DEBUG_MEMORY_FREED
* /define DEBUG_MEMORY_LOCATION

/if defined(DEBUG)
/if not defined(DEBUG_MEMORY)
/define DEBUG_MEMORY
/endif
/endif

* DEBUG_MEMORY_LOCATION:
*
* DEBUG_MEMORY_LOCATION should be activated only when debugging
* libxml i.e. if libxml has been configured with --with-debug-mem too.

/if defined(DEBUG_MEMORY_LOCATION)
/endif

* The XML memory wrapper support 4 basic overloadable functions.

* xmlFreeFunc:
* @mem: an already allocated block of memory
*
* Signature for a free() implementation.

d xmlFreeFunc s * based(######typedef######) d procptr

* xmlMallocFunc:
* @size:  the size requested in bytes
*
* Signature for a malloc() implementation.
*
* Returns a pointer to the newly allocated block or NULL in case of error.

d xmlMallocFunc s * based(######typedef######) d procptr

* xmlReallocFunc:
* @mem: an already allocated block of memory
* @size:  the new size requested in bytes
*
* Signature for a realloc() implementation.
*
* Returns a pointer to the newly reallocated block or NULL in case of error.

d xmlReallocFunc s * based(######typedef######) d procptr

* xmlStrdupFunc:
* @str: a zero terminated string
*
* Signature for an strdup() implementation.
*
* Returns the copy of the string or NULL in case of error.

d xmlStrdupFunc s * based(######typedef######) d procptr

* The 5 interfaces used for all memory handling within libxml.
* Since indirect calls are only supported via a based prototype,
*   storage is accessed via functions.

d get_xmlFree pr extproc('__get_xmlFree') d like(xmlFreeFunc)

d set_xmlFree pr extproc('__set_xmlFree') d func value like(xmlFreeFunc)

d xmlFree pr extproc('__call_xmlFree') d mem * value void *

d get_xmlMalloc pr extproc('__get_xmlMalloc') d like(xmlMallocFunc)

d set_xmlMalloc pr extproc('__set_xmlMalloc') d func value like(xmlMallocFunc)

d xmlMalloc pr * extproc('__call_xmlMalloc') void * d size value like(xmlCsize_t)

d get_xmlMallocAtomic… d pr extproc('__get_xmlMallocAtomic') d like(xmlMallocFunc)

d set_xmlMallocAtomic… d pr extproc('__set_xmlMallocAtomic') d func value like(xmlMallocFunc)

d xmlMallocAtomic… d pr * extproc('__call_xmlMallocAtomic') void * d size value like(xmlCsize_t)

d get_xmlRealloc pr extproc('__get_xmlRealloc') d like(xmlReallocFunc)

d set_xmlRealloc pr extproc('__set_xmlRealloc') d func value like(xmlReallocFunc)

d xmlRealloc pr * extproc('__call_xmlRealloc') void * d mem * value void * d size value like(xmlCsize_t)

d get_xmlMemStrdup… d pr extproc('__get_xmlMemStrdup') d like(xmlStrdupFunc)

d set_xmlMemStrdup… d pr extproc('__set_xmlMemstrdup') d func value like(xmlStrdupFunc)

d xmlMemStrdup pr * extproc('__call_xmlMemStrdup') void * d str * value options(*string) const char *

* The way to overload the existing functions.
* The xmlGc function have an extra entry for atomic block
* allocations useful for garbage collected memory allocators

d xmlMemSetup pr extproc('xmlMemSetup') d like(xmlCint) d freeFunc value like(xmlFreeFunc) d mallocFunc value like(xmlMallocFunc) d reallocFunc value like(xmlReallocFunc) d strdupFunc value like(xmlStrdupFunc)

d xmlMemGet pr extproc('xmlMemGet') d like(xmlCint) d freeFunc like(xmlFreeFunc) d mallocFunc like(xmlMallocFunc) d reallocFunc like(xmlReallocFunc) d strdupFunc like(xmlStrdupFunc)

d xmlGcMemSetup pr extproc('xmlGcMemSetup') d like(xmlCint) d freeFunc value like(xmlFreeFunc) d mallocFunc value like(xmlMallocFunc) d mallocAtomicFunc… d value like(xmlMallocFunc) d reallocFunc value like(xmlReallocFunc) d strdupFunc value like(xmlStrdupFunc)

d xmlGcMemGet pr extproc('xmlGcMemGet') d like(xmlCint) d freeFunc like(xmlFreeFunc) d mallocFunc like(xmlMallocFunc) d mallocAtomicFunc… d like(xmlMallocFunc) d reallocFunc like(xmlReallocFunc) d strdupFunc like(xmlStrdupFunc)

* Initialization of the memory layer.

d xmlInitMemory pr extproc('xmlInitMemory') d like(xmlCint)

* Cleanup of the memory layer.

d xmlCleanupMemory… d pr extproc('xmlCleanupMemory')

* These are specific to the XML debug memory wrapper.

d xmlMemUsed pr extproc('xmlMemUsed') d like(xmlCint)

d xmlMemBlocks pr extproc('xmlMemBlocks') d like(xmlCint)

d xmlMemDisplay pr extproc('xmlMemDisplay') d fp * value FILE *

d xmlMmDisplayLast… d pr extproc('xmlMemDisplayLast') d fp * value FILE * d nbBytes value like(xmlClong)

d xmlMemShow pr extproc('xmlMemShow') d fp * value FILE * d nr value like(xmlCint)

d xmlMemoryDump pr extproc('xmlMemoryDump')

d xmlMemMalloc pr * extproc('xmlMemMalloc') void * d size value like(xmlCsize_t)

d xmlMemRealloc pr * extproc('xmlMemRealloc') void * d ptr * value void * d size value like(xmlCsize_t)

d xmlMemFree pr extproc('xmlMemFree') d ptr * value void *

d xmlMemoryStrdup… d pr * extproc('xmlMemoryStrdup') char * d str * value options(*string) const char *

d xmlMallocLoc pr * extproc('xmlMallocLoc') void * d size value like(xmlCsize_t) d file * value options(*string) const char * d line value like(xmlCint)

d xmlReallocLoc pr * extproc('xmlReallocLoc') void * d ptr * value void * d size value like(xmlCsize_t) d file * value options(*string) const char * d line value like(xmlCint)

d xmlMallocAtomicLoc… d pr * extproc('xmlMallocAtomicLoc') void * d size value like(xmlCsize_t) d file * value options(*string) const char * d line value like(xmlCint)

d xmlMemStrdupLoc… d pr * extproc('xmlMemStrdupLoc') char * d str * value options(*string) const char * d file * value options(*string) const char * d line value like(xmlCint)

/if not defined(XML_GLOBALS_H)
/if not defined(XML_THREADS_H__)
/include "libxmlrpg/threads"
/include "libxmlrpg/globals"
/endif
/endif

/endif                                                                    DEBUG_MEMORY_ALLOC__