
distri and nodeset feature * add UaModeler project including XML export * add nodeset using test server
123 lines
2.8 KiB
C
123 lines
2.8 KiB
C
#ifndef UA_UTIL_H_
|
|
#define UA_UTIL_H_
|
|
|
|
#include "ua_config.h"
|
|
|
|
#include <assert.h>
|
|
#define UA_assert(ignore) assert(ignore)
|
|
|
|
/*********************/
|
|
/* Memory Management */
|
|
/*********************/
|
|
|
|
/* Replace the macros with functions for custom allocators if necessary */
|
|
#include <stdlib.h> // malloc, free
|
|
#ifdef _WIN32
|
|
# include <malloc.h>
|
|
#endif
|
|
|
|
#ifndef UA_free
|
|
# define UA_free(ptr) free(ptr)
|
|
#endif
|
|
#ifndef UA_malloc
|
|
# define UA_malloc(size) malloc(size)
|
|
#endif
|
|
#ifndef UA_calloc
|
|
# define UA_calloc(num, size) calloc(num, size)
|
|
#endif
|
|
#ifndef UA_realloc
|
|
# define UA_realloc(ptr, size) realloc(ptr, size)
|
|
#endif
|
|
|
|
#ifndef NO_ALLOCA
|
|
# ifdef __GNUC__
|
|
# define UA_alloca(size) __builtin_alloca (size)
|
|
# elif defined(_WIN32)
|
|
# define UA_alloca(SIZE) _alloca(SIZE)
|
|
# else
|
|
# include <alloca.h>
|
|
# define UA_alloca(SIZE) alloca(SIZE)
|
|
# endif
|
|
#endif
|
|
|
|
#define container_of(ptr, type, member) \
|
|
(type *)((uintptr_t)ptr - offsetof(type,member))
|
|
|
|
/************************/
|
|
/* Thread Local Storage */
|
|
/************************/
|
|
|
|
#ifdef UA_ENABLE_MULTITHREADING
|
|
# ifdef __GNUC__
|
|
# define UA_THREAD_LOCAL __thread
|
|
# elif defined(_MSC_VER)
|
|
# define UA_THREAD_LOCAL __declspec(thread)
|
|
# else
|
|
# error No thread local storage keyword defined for this compiler
|
|
# endif
|
|
#else
|
|
# define UA_THREAD_LOCAL
|
|
#endif
|
|
|
|
/********************/
|
|
/* System Libraries */
|
|
/********************/
|
|
|
|
#ifdef _WIN32
|
|
# include <winsock2.h> //needed for amalgamation
|
|
# include <windows.h>
|
|
# undef SLIST_ENTRY
|
|
#endif
|
|
|
|
#include <time.h>
|
|
#if defined(_WIN32) && !defined(__MINGW32__)
|
|
int gettimeofday(struct timeval *tp, struct timezone *tzp);
|
|
#else
|
|
# include <sys/time.h>
|
|
#endif
|
|
|
|
#if defined(__APPLE__) || defined(__MACH__)
|
|
#include <mach/clock.h>
|
|
#include <mach/mach.h>
|
|
#endif
|
|
|
|
/*************************/
|
|
/* External Dependencies */
|
|
/*************************/
|
|
|
|
#include "queue.h"
|
|
|
|
#ifdef UA_ENABLE_MULTITHREADING
|
|
# define _LGPL_SOURCE
|
|
# include <urcu.h>
|
|
# include <urcu/wfcqueue.h>
|
|
# include <urcu/uatomic.h>
|
|
# include <urcu/rculfhash.h>
|
|
# include <urcu/lfstack.h>
|
|
# ifdef NDEBUG
|
|
# define UA_RCU_LOCK() rcu_read_lock()
|
|
# define UA_RCU_UNLOCK() rcu_read_unlock()
|
|
# define UA_ASSERT_RCU_LOCKED()
|
|
# define UA_ASSERT_RCU_UNLOCKED()
|
|
# else
|
|
extern UA_THREAD_LOCAL bool rcu_locked;
|
|
# define UA_ASSERT_RCU_LOCKED() assert(rcu_locked)
|
|
# define UA_ASSERT_RCU_UNLOCKED() assert(!rcu_locked)
|
|
# define UA_RCU_LOCK() do { \
|
|
UA_ASSERT_RCU_UNLOCKED(); \
|
|
rcu_locked = true; \
|
|
rcu_read_lock(); } while(0)
|
|
# define UA_RCU_UNLOCK() do { \
|
|
UA_ASSERT_RCU_LOCKED(); \
|
|
rcu_locked = false; \
|
|
rcu_read_lock(); } while(0)
|
|
# endif
|
|
#else
|
|
# define UA_RCU_LOCK()
|
|
# define UA_RCU_UNLOCK()
|
|
# define UA_ASSERT_RCU_LOCKED()
|
|
# define UA_ASSERT_RCU_UNLOCKED()
|
|
#endif
|
|
|
|
#endif /* UA_UTIL_H_ */
|