diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b9b420b5..d890ef5cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -277,6 +277,7 @@ set(SOURCES lib/parsers.c lib/context.c lib/sha-1.c + lib/alloc.c ) if (NOT LWS_WITHOUT_CLIENT) diff --git a/lib/alloc.c b/lib/alloc.c new file mode 100644 index 000000000..3bc5260ee --- /dev/null +++ b/lib/alloc.c @@ -0,0 +1,30 @@ +#include "private-libwebsockets.h" + +static void *_realloc(void *ptr, size_t size) +{ + if (size) + return realloc(ptr, size); + else if (ptr) + free(ptr); + return NULL; +} + +void *(*_lws_realloc)(void *ptr, size_t size) = _realloc; + +void *lws_realloc(void *ptr, size_t size) +{ + return _lws_realloc(ptr, size); +} + +void *lws_zalloc(size_t size) +{ + void *ptr = _lws_realloc(NULL, size); + if (ptr) + memset(ptr, 0, size); + return ptr; +} + +void lws_set_allocator(void *(*cb)(void *ptr, size_t size)) +{ + _lws_realloc = cb; +} diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index 0713b18f2..ff0ca338f 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -1337,6 +1337,12 @@ libwebsocket_read(struct libwebsocket_context *context, LWS_VISIBLE LWS_EXTERN struct libwebsocket_extension *libwebsocket_get_internal_extensions(); #endif +/* + * custom allocator support + */ +LWS_VISIBLE LWS_EXTERN void +lws_set_allocator(void *(*realloc)(void *ptr, size_t size)); + #ifdef __cplusplus } #endif diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index f053ae769..6fb16680c 100755 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -1157,6 +1157,18 @@ lws_ssl_capable_write_no_ssl(struct libwebsocket *wsi, unsigned char *buf, int l #define lws_handshake_server(_a, _b, _c, _d) (0) #endif +/* + * custom allocator + */ +LWS_EXTERN void* +lws_realloc(void *ptr, size_t size); + +LWS_EXTERN void* +lws_zalloc(size_t size); + +#define lws_malloc(S) lws_realloc(NULL, S) +#define lws_free(P) lws_realloc(P, 0) + /* * lws_plat_ */