Wolfgang Hottgenroth da498bb161 * add include files and static library due to problems with AMALGAM'ED
distri and nodeset feature
* add UaModeler project including XML export
* add nodeset using test server
2016-06-08 11:21:06 +02:00

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_ */