Annotation of embedaddon/curl/lib/curl_memory.h, revision 1.1.1.1
1.1 misho 1: #ifndef HEADER_CURL_MEMORY_H
2: #define HEADER_CURL_MEMORY_H
3: /***************************************************************************
4: * _ _ ____ _
5: * Project ___| | | | _ \| |
6: * / __| | | | |_) | |
7: * | (__| |_| | _ <| |___
8: * \___|\___/|_| \_\_____|
9: *
10: * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
11: *
12: * This software is licensed as described in the file COPYING, which
13: * you should have received as part of this distribution. The terms
14: * are also available at https://curl.haxx.se/docs/copyright.html.
15: *
16: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
17: * copies of the Software, and permit persons to whom the Software is
18: * furnished to do so, under the terms of the COPYING file.
19: *
20: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21: * KIND, either express or implied.
22: *
23: ***************************************************************************/
24:
25: /*
26: * Nasty internal details ahead...
27: *
28: * File curl_memory.h must be included by _all_ *.c source files
29: * that use memory related functions strdup, malloc, calloc, realloc
30: * or free, and given source file is used to build libcurl library.
31: * It should be included immediately before memdebug.h as the last files
32: * included to avoid undesired interaction with other memory function
33: * headers in dependent libraries.
34: *
35: * There is nearly no exception to above rule. All libcurl source
36: * files in 'lib' subdirectory as well as those living deep inside
37: * 'packages' subdirectories and linked together in order to build
38: * libcurl library shall follow it.
39: *
40: * File lib/strdup.c is an exception, given that it provides a strdup
41: * clone implementation while using malloc. Extra care needed inside
42: * this one.
43: *
44: * The need for curl_memory.h inclusion is due to libcurl's feature
45: * of allowing library user to provide memory replacement functions,
46: * memory callbacks, at runtime with curl_global_init_mem()
47: *
48: * Any *.c source file used to build libcurl library that does not
49: * include curl_memory.h and uses any memory function of the five
50: * mentioned above will compile without any indication, but it will
51: * trigger weird memory related issues at runtime.
52: *
53: * OTOH some source files from 'lib' subdirectory may additionally be
54: * used directly as source code when using some curlx_ functions by
55: * third party programs that don't even use libcurl at all. When using
56: * these source files in this way it is necessary these are compiled
57: * with CURLX_NO_MEMORY_CALLBACKS defined, in order to ensure that no
58: * attempt of calling libcurl's memory callbacks is done from code
59: * which can not use this machinery.
60: *
61: * Notice that libcurl's 'memory tracking' system works chaining into
62: * the memory callback machinery. This implies that when compiling
63: * 'lib' source files with CURLX_NO_MEMORY_CALLBACKS defined this file
64: * disengages usage of libcurl's 'memory tracking' system, defining
65: * MEMDEBUG_NODEFINES and overriding CURLDEBUG purpose.
66: *
67: * CURLX_NO_MEMORY_CALLBACKS takes precedence over CURLDEBUG. This is
68: * done in order to allow building a 'memory tracking' enabled libcurl
69: * and at the same time allow building programs which do not use it.
70: *
71: * Programs and libraries in 'tests' subdirectories have specific
72: * purposes and needs, and as such each one will use whatever fits
73: * best, depending additionally whether it links with libcurl or not.
74: *
75: * Caveat emptor. Proper curlx_* separation is a work in progress
76: * the same as CURLX_NO_MEMORY_CALLBACKS usage, some adjustments may
77: * still be required. IOW don't use them yet, there are sharp edges.
78: */
79:
80: #ifdef HEADER_CURL_MEMDEBUG_H
81: #error "Header memdebug.h shall not be included before curl_memory.h"
82: #endif
83:
84: #ifndef CURLX_NO_MEMORY_CALLBACKS
85:
86: #ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS /* only if not already done */
87: /*
88: * The following memory function replacement typedef's are COPIED from
89: * curl/curl.h and MUST match the originals. We copy them to avoid having to
90: * include curl/curl.h here. We avoid that include since it includes stdio.h
91: * and other headers that may get messed up with defines done here.
92: */
93: typedef void *(*curl_malloc_callback)(size_t size);
94: typedef void (*curl_free_callback)(void *ptr);
95: typedef void *(*curl_realloc_callback)(void *ptr, size_t size);
96: typedef char *(*curl_strdup_callback)(const char *str);
97: typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size);
98: #define CURL_DID_MEMORY_FUNC_TYPEDEFS
99: #endif
100:
101: extern curl_malloc_callback Curl_cmalloc;
102: extern curl_free_callback Curl_cfree;
103: extern curl_realloc_callback Curl_crealloc;
104: extern curl_strdup_callback Curl_cstrdup;
105: extern curl_calloc_callback Curl_ccalloc;
106: #if defined(WIN32) && defined(UNICODE)
107: extern curl_wcsdup_callback Curl_cwcsdup;
108: #endif
109:
110: #ifndef CURLDEBUG
111:
112: /*
113: * libcurl's 'memory tracking' system defines strdup, malloc, calloc,
114: * realloc and free, along with others, in memdebug.h in a different
115: * way although still using memory callbacks forward declared above.
116: * When using the 'memory tracking' system (CURLDEBUG defined) we do
117: * not define here the five memory functions given that definitions
118: * from memdebug.h are the ones that shall be used.
119: */
120:
121: #undef strdup
122: #define strdup(ptr) Curl_cstrdup(ptr)
123: #undef malloc
124: #define malloc(size) Curl_cmalloc(size)
125: #undef calloc
126: #define calloc(nbelem,size) Curl_ccalloc(nbelem, size)
127: #undef realloc
128: #define realloc(ptr,size) Curl_crealloc(ptr, size)
129: #undef free
130: #define free(ptr) Curl_cfree(ptr)
131:
132: #ifdef WIN32
133: # ifdef UNICODE
134: # undef wcsdup
135: # define wcsdup(ptr) Curl_cwcsdup(ptr)
136: # undef _wcsdup
137: # define _wcsdup(ptr) Curl_cwcsdup(ptr)
138: # undef _tcsdup
139: # define _tcsdup(ptr) Curl_cwcsdup(ptr)
140: # else
141: # undef _tcsdup
142: # define _tcsdup(ptr) Curl_cstrdup(ptr)
143: # endif
144: #endif
145:
146: #endif /* CURLDEBUG */
147:
148: #else /* CURLX_NO_MEMORY_CALLBACKS */
149:
150: #ifndef MEMDEBUG_NODEFINES
151: #define MEMDEBUG_NODEFINES
152: #endif
153:
154: #endif /* CURLX_NO_MEMORY_CALLBACKS */
155:
156: #endif /* HEADER_CURL_MEMORY_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>