| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include "JSONMemory.h"
- #ifdef JSON_MEMORY_MANAGE
- #include "JSONNode.h"
- void auto_expand::purge(void) json_nothrow {
- for(JSON_MAP(void *, void *)::iterator i = mymap.begin(), en = mymap.end(); i != en; ++i){
- #if defined(JSON_DEBUG) || defined(JSON_SAFE)
- void * temp = (void*)i -> first; //because its pass by reference
- libjson_free<void>(temp);
- #else
- libjson_free<void>((void*)i -> first);
- #endif
- }
- }
- void auto_expand_node::purge(void) json_nothrow {
- for(JSON_MAP(void *, JSONNode *)::iterator i = mymap.begin(), en = mymap.end(); i != en; ++i){
- JSONNode::deleteJSONNode((JSONNode *)i -> second);
- }
- }
- #ifdef JSON_STREAM
- #include "JSONStream.h"
- void auto_expand_stream::purge(void) json_nothrow {
- for(JSON_MAP(void *, JSONStream *)::iterator i = mymap.begin(), en = mymap.end(); i != en; ++i){
- JSONStream::deleteJSONStream((JSONStream *)i -> second);
- }
- }
- #endif
- #endif
- #if defined(JSON_MEMORY_CALLBACKS) || defined(JSON_MEMORY_POOL)
- #ifdef JSON_MEMORY_POOL
- #include "JSONMemoryPool.h"
- static bucket_pool_8<MEMPOOL_1, MEMPOOL_2, MEMPOOL_3, MEMPOOL_4, MEMPOOL_5, MEMPOOL_6, MEMPOOL_7, MEMPOOL_8> json_generic_mempool;
-
- //This class is only meant to initiate the mempool to start out using std::malloc/realloc/free
- class mempool_callback_setter {
- public:
- LIBJSON_OBJECT(mempool_callback_setter);
- inline mempool_callback_setter(void) json_nothrow {
- ` LIBJSON_CTOR;
- mempool_callbacks::set(std::malloc, std::realloc, std::free);
- }
- private:
- inline mempool_callback_setter(const mempool_callback_setter & o);
- inline mempool_callback_setter & operator = (const mempool_callback_setter & o);
- };
- static mempool_callback_setter __mempoolcallbacksetter;
- #endif
- #include "JSONSingleton.h"
- void * JSONMemory::json_malloc(size_t siz) json_nothrow {
- #ifdef JSON_MEMORY_POOL
- return json_generic_mempool.allocate(siz);
- #else
- if (json_malloc_t callback = JSONSingleton<json_malloc_t>::get()){
- #if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successful
- void * result = callback(siz);
- JSON_ASSERT(result, JSON_TEXT("Out of memory"));
- return result;
- #else
- return callback(siz);
- #endif
- }
- #if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successful
- void * result = std::malloc(siz);
- JSON_ASSERT(result, JSON_TEXT("Out of memory"));
- return result;
- #else
- return std::malloc(siz);
- #endif
- #endif
- }
- void JSONMemory::json_free(void * ptr) json_nothrow {
- #ifdef JSON_MEMORY_POOL
- json_generic_mempool.deallocate(ptr);
- #else
- if (json_free_t callback = JSONSingleton<json_free_t>::get()){
- callback(ptr);
- } else {
- std::free(ptr);
- }
- #endif
- }
- void * JSONMemory::json_realloc(void * ptr, size_t siz) json_nothrow {
- #ifdef JSON_MEMORY_POOL
- return json_generic_mempool.reallocate(ptr, siz);
- #else
- if (json_realloc_t callback = JSONSingleton<json_realloc_t>::get()){
- #if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successful
- void * result = callback(ptr, siz);
- JSON_ASSERT(result, JSON_TEXT("Out of memory"));
- return result;
- #else
- return callback(ptr, siz);
- #endif
- }
- #if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successful
- void * result = std::realloc(ptr, siz);
- JSON_ASSERT(result, JSON_TEXT("Out of memory"));
- return result;
- #else
- return std::realloc(ptr, siz);
- #endif
- #endif
- }
- #ifdef JSON_MEMORY_POOL
- //it is okay to pass null to these callbacks, no make sure they function exists
- static void * malloc_proxy(size_t siz) json_nothrow {
- if (json_malloc_t callback = JSONSingleton<json_malloc_t>::get()){
- return callback(siz);
- }
- return std::malloc(siz);
- }
- static void * realloc_proxy(void * ptr, size_t siz) json_nothrow {
- if (json_realloc_t callback = JSONSingleton<json_realloc_t>::get()){
- return callback(ptr, siz);
- }
- return std::realloc(ptr, siz);
- }
- static void free_proxy(void * ptr){
- if (json_free_t callback = JSONSingleton<json_free_t>::get()){
- callback(ptr);
- } else {
- std::free(ptr);
- }
- }
- #endif
- void JSONMemory::registerMemoryCallbacks(json_malloc_t mal, json_realloc_t real, json_free_t fre) json_nothrow {
- JSONSingleton<json_malloc_t>::set(mal);
- JSONSingleton<json_realloc_t>::set(real);
- JSONSingleton<json_free_t>::set(fre);
- #ifdef JSON_MEMORY_POOL
- mempool_callbacks::set(malloc_proxy, realloc_proxy, free_proxy);
- #endif
- }
- #endif
|