Procházet zdrojové kódy

Optional singleton malloc that can be switched via a global variable

Julius Pfrommer před 5 roky
rodič
revize
bf9828b5b6

+ 9 - 0
CMakeLists.txt

@@ -251,6 +251,15 @@ mark_as_advanced(UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS)
 option(UA_ENABLE_DETERMINISTIC_RNG "Do not seed the random number generator (e.g. for unit tests)." OFF)
 mark_as_advanced(UA_ENABLE_DETERMINISTIC_RNG)
 
+option(UA_ENABLE_MALLOC_SINGLETON
+       "Use a global variable pointer for malloc (and free, ...) that can be switched at runtime" OFF)
+mark_as_advanced(UA_ENABLE_MALLOC_SINGLETON)
+if(UA_ENABLE_MALLOC_SINGLETON)
+    if(NOT "${UA_ARCHITECTURE}" MATCHES "posix")
+        message(FATAL_ERROR "The singleton malloc is available only for the posix architecture")
+    endif()
+endif()
+
 option(UA_ENABLE_VALGRIND_INTERACTIVE "Enable dumping valgrind every iteration. CAUTION! SLOWDOWN!" OFF)
 mark_as_advanced(UA_ENABLE_VALGRIND_INTERACTIVE)
 

+ 15 - 4
arch/posix/ua_architecture.h

@@ -109,18 +109,29 @@
 # define UA_if_nametoindex if_nametoindex
 #endif
 
+#ifdef UA_ENABLE_MALLOC_SINGLETON
+extern void * (*UA_globalMalloc)(size_t size);
+extern void (*UA_globalFree)(void *ptr);
+extern void * (*UA_globalCalloc)(size_t nelem, size_t elsize);
+extern void * (*UA_globalRealloc)(void *ptr, size_t size);
+# define UA_free(ptr) UA_globalFree(ptr)
+# define UA_malloc(size) UA_globalMalloc(size)
+# define UA_calloc(num, size) UA_globalCalloc(num, size)
+# define UA_realloc(ptr, size) UA_globalRealloc(ptr, size)
+#endif
+
 #include <stdlib.h>
 #ifndef UA_free
-#define UA_free free
+# define UA_free free
 #endif
 #ifndef UA_malloc
-#define UA_malloc malloc
+# define UA_malloc malloc
 #endif
 #ifndef UA_calloc
-#define UA_calloc calloc
+# define UA_calloc calloc
 #endif
 #ifndef UA_realloc
-#define UA_realloc realloc
+# define UA_realloc realloc
 #endif
 
 #include <stdio.h>

+ 8 - 0
arch/posix/ua_architecture_functions.c

@@ -8,6 +8,14 @@
 
 #include <open62541/types.h>
 
+/* Global malloc singletons */
+#ifdef UA_ENABLE_MALLOC_SINGLETON
+void * (*UA_globalMalloc)(size_t size) = malloc;
+void (*UA_globalFree)(void *ptr) = free;
+void * (*UA_globalCalloc)(size_t nelem, size_t elsize) = calloc;
+void * (*UA_globalRealloc)(void *ptr, size_t size) = realloc;
+#endif
+
 unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){
   int opts = fcntl(sockfd, F_GETFL);
   if(opts < 0 || fcntl(sockfd, F_SETFL, opts & (~O_NONBLOCK)) < 0)

+ 1 - 0
include/open62541/config.h.in

@@ -53,6 +53,7 @@
 #cmakedefine UA_ENABLE_DISCOVERY
 #cmakedefine UA_ENABLE_DISCOVERY_MULTICAST
 #cmakedefine UA_ENABLE_QUERY
+#cmakedefine UA_ENABLE_MALLOC_SINGLETON
 #cmakedefine UA_ENABLE_DISCOVERY_SEMAPHORE
 #cmakedefine UA_ENABLE_UNIT_TEST_FAILURE_HOOKS
 #cmakedefine UA_ENABLE_VALGRIND_INTERACTIVE