15ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef HEADER_CURL_MEMORY_H 25ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define HEADER_CURL_MEMORY_H 35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*************************************************************************** 45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * _ _ ____ _ 55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Project ___| | | | _ \| | 65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * / __| | | | |_) | | 75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * | (__| |_| | _ <| |___ 85ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * \___|\___/|_| \_\_____| 95ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 108f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. 115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is licensed as described in the file COPYING, which 135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * you should have received as part of this distribution. The terms 148f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html. 155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * You may opt to use, copy, modify, merge, publish, distribute and/or sell 175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * copies of the Software, and permit persons to whom the Software is 185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * furnished to do so, under the terms of the COPYING file. 195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * KIND, either express or implied. 225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/ 245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 25e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* 26e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Nasty internal details ahead... 27e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 28e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * File curl_memory.h must be included by _all_ *.c source files 29e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * that use memory related functions strdup, malloc, calloc, realloc 30e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * or free, and given source file is used to build libcurl library. 31e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * It should be included immediately before memdebug.h as the last files 32e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * included to avoid undesired interaction with other memory function 33e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * headers in dependent libraries. 34e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 35e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * There is nearly no exception to above rule. All libcurl source 36e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * files in 'lib' subdirectory as well as those living deep inside 37e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 'packages' subdirectories and linked together in order to build 38e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * libcurl library shall follow it. 39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 40e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * File lib/strdup.c is an exception, given that it provides a strdup 41e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * clone implementation while using malloc. Extra care needed inside 42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * this one. TODO: revisit this paragraph and related code. 43e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * The need for curl_memory.h inclusion is due to libcurl's feature 45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * of allowing library user to provide memory replacement functions, 46e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * memory callbacks, at runtime with curl_global_init_mem() 47e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 48e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Any *.c source file used to build libcurl library that does not 49e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * include curl_memory.h and uses any memory function of the five 50e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * mentioned above will compile without any indication, but it will 51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * trigger weird memory related issues at runtime. 52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * OTOH some source files from 'lib' subdirectory may additionally be 54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * used directly as source code when using some curlx_ functions by 55e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * third party programs that don't even use libcurl at all. When using 56e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * these source files in this way it is necessary these are compiled 57e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * with CURLX_NO_MEMORY_CALLBACKS defined, in order to ensure that no 58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * attempt of calling libcurl's memory callbacks is done from code 59e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * which can not use this machinery. 60e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 61e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Notice that libcurl's 'memory tracking' system works chaining into 62e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * the memory callback machinery. This implies that when compiling 63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 'lib' source files with CURLX_NO_MEMORY_CALLBACKS defined this file 64e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * disengages usage of libcurl's 'memory tracking' system, defining 65e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * MEMDEBUG_NODEFINES and overriding CURLDEBUG purpose. 66e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 67e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURLX_NO_MEMORY_CALLBACKS takes precedence over CURLDEBUG. This is 68e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * done in order to allow building a 'memory tracking' enabled libcurl 69e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * and at the same time allow building programs which do not use it. 70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Programs and libraries in 'tests' subdirectories have specific 72e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * purposes and needs, and as such each one will use whatever fits 73e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * best, depending additionally wether it links with libcurl or not. 74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Caveat emptor. Proper curlx_* separation is a work in progress 76e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * the same as CURLX_NO_MEMORY_CALLBACKS usage, some adjustments may 77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * still be required. IOW don't use them yet, there are sharp edges. 78e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef HEADER_CURL_MEMDEBUG_H 81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#error "Header memdebug.h shall not be included before curl_memory.h" 82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifndef CURLX_NO_MEMORY_CALLBACKS 85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 868f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS /* only if not already done */ 878f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo/* 888f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * The following memory function replacement typedef's are COPIED from 898f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * curl/curl.h and MUST match the originals. We copy them to avoid having to 908f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * include curl/curl.h here. We avoid that include since it includes stdio.h 918f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * and other headers that may get messed up with defines done here. 928f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo */ 938f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymotypedef void *(*curl_malloc_callback)(size_t size); 948f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymotypedef void (*curl_free_callback)(void *ptr); 958f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymotypedef void *(*curl_realloc_callback)(void *ptr, size_t size); 968f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymotypedef char *(*curl_strdup_callback)(const char *str); 978f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymotypedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); 988f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#define CURL_DID_MEMORY_FUNC_TYPEDEFS 998f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#endif 1005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern curl_malloc_callback Curl_cmalloc; 1025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern curl_free_callback Curl_cfree; 1035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern curl_realloc_callback Curl_crealloc; 1045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern curl_strdup_callback Curl_cstrdup; 1055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern curl_calloc_callback Curl_ccalloc; 106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#if defined(WIN32) && defined(UNICODE) 107e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETextern curl_wcsdup_callback Curl_cwcsdup; 108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 1095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef CURLDEBUG 111e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 112e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* 113e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * libcurl's 'memory tracking' system defines strdup, malloc, calloc, 114e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * realloc and free, along with others, in memdebug.h in a different 115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * way although still using memory callbacks forward declared above. 116e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * When using the 'memory tracking' system (CURLDEBUG defined) we do 117e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * not define here the five memory functions given that definitions 118e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * from memdebug.h are the ones that shall be used. 119e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 120e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 1215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef strdup 1225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define strdup(ptr) Curl_cstrdup(ptr) 1235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef malloc 1245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define malloc(size) Curl_cmalloc(size) 1255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef calloc 1265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define calloc(nbelem,size) Curl_ccalloc(nbelem, size) 1275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef realloc 1285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define realloc(ptr,size) Curl_crealloc(ptr, size) 1295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#undef free 1305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define free(ptr) Curl_cfree(ptr) 1315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 132e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef WIN32 133e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# ifdef UNICODE 134e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef wcsdup 135e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define wcsdup(ptr) Curl_cwcsdup(ptr) 136e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef _wcsdup 137e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define _wcsdup(ptr) Curl_cwcsdup(ptr) 138e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef _tcsdup 139e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define _tcsdup(ptr) Curl_cwcsdup(ptr) 140e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# else 141e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# undef _tcsdup 142e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# define _tcsdup(ptr) Curl_cstrdup(ptr) 143e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# endif 1445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 1455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 146e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif /* CURLDEBUG */ 147e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 148e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#else /* CURLX_NO_MEMORY_CALLBACKS */ 149e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 150e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifndef MEMDEBUG_NODEFINES 151e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define MEMDEBUG_NODEFINES 152e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 153e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 154e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif /* CURLX_NO_MEMORY_CALLBACKS */ 155e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 1565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HEADER_CURL_MEMORY_H */ 157