40#ifdef INCLUDE_API_FROM_MODULE_LOAD
41 #define OPTIONAL(return_type, function_name, ...) \
42 if(!g_module_symbol(module->module, #function_name, (gpointer) & (module->function_name))) \
43 module->function_name = NULL
44 #define REQUIRED(return_type, function_name, ...) \
45 if(!g_module_symbol(module->module, #function_name, (gpointer) & (module->function_name))) \
47 #define DEFAULT(return_type, function_name, ...) \
48 if(!g_module_symbol(module->module, #function_name, (gpointer) & (module->function_name))) \
49 module->function_name = default_ ## function_name
52 module->module = g_module_open(libname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
55 if(!g_module_symbol(module->module,
"dt_module_dt_version", (gpointer) & (version)))
goto api_h_error;
60 libname, abs(version()), version() < 0 ?
"debug" :
"opt", abs(
dt_version()),
64 if(!g_module_symbol(module->module,
"dt_module_mod_version", (gpointer) & (module->version)))
goto api_h_error;
69 if(module->module) g_module_close(module->module);
72 #undef INCLUDE_API_FROM_MODULE_LOAD
73#elif defined(INCLUDE_API_FROM_MODULE_H)
74 #define OPTIONAL(return_type, function_name, ...) return_type (*function_name)(__VA_ARGS__)
75 #define REQUIRED(return_type, function_name, ...) return_type (*function_name)(__VA_ARGS__)
76 #define DEFAULT(return_type, function_name, ...) return_type (*function_name)(__VA_ARGS__)
78 #undef INCLUDE_API_FROM_MODULE_H
79#elif defined(INCLUDE_API_FROM_MODULE_STATIC)
94 #define DT_MODULE_PICK_0(fn, fb) fb
95 #define DT_MODULE_PICK_1(fn, fb) fn
96 #define DT_MODULE_PICK_C(h, fn, fb) DT_MODULE_PICK_ ## h(fn, fb)
97 #define DT_MODULE_PICK_B(h, fn, fb) DT_MODULE_PICK_C(h, fn, fb)
98 #define DT_MODULE_PICK(fn, fb) DT_MODULE_PICK_B(DT_MODULE_HAS_ ## fn, fn, fb)
99 #define OPTIONAL(return_type, function_name, ...) module->function_name = DT_MODULE_PICK(function_name, NULL)
100 #define REQUIRED(return_type, function_name, ...) module->function_name = function_name
101 #define DEFAULT(return_type, function_name, ...) module->function_name = DT_MODULE_PICK(function_name, NULL)
102 #undef INCLUDE_API_FROM_MODULE_STATIC
103#elif defined(INCLUDE_API_FROM_MODULE_STATIC_DEFAULTS)
107 #define OPTIONAL(return_type, function_name, ...) (void)0
108 #define REQUIRED(return_type, function_name, ...) (void)0
109 #define DEFAULT(return_type, function_name, ...) \
110 if(IS_NULL_PTR(module->function_name)) module->function_name = default_ ## function_name
111 #undef INCLUDE_API_FROM_MODULE_STATIC_DEFAULTS
112#elif defined(INCLUDE_API_FROM_MODULE_LOAD_BY_SO)
113 #define OPTIONAL(return_type, function_name, ...) module->function_name = so->function_name
114 #define REQUIRED(return_type, function_name, ...) module->function_name = so->function_name
115 #define DEFAULT(return_type, function_name, ...) module->function_name = so->function_name
116 #undef INCLUDE_API_FROM_MODULE_LOAD_BY_SO
139 #ifdef DT_MODULE_SYMBOL_PREFIX
140 #define DT_MODULE_SYM_STR_(x) #x
141 #define DT_MODULE_SYM_STR(x) DT_MODULE_SYM_STR_(x)
142 #define DT_MODULE_SYM_CAT_(a, b) a ## b
143 #define DT_MODULE_SYM_CAT(a, b) DT_MODULE_SYM_CAT_(a, b)
145 #define DT_MODULE_SYM(fn) __asm__("_" DT_MODULE_SYM_STR(DT_MODULE_SYM_CAT(DT_MODULE_SYMBOL_PREFIX, fn)))
147 #define DT_MODULE_SYM(fn) __asm__(DT_MODULE_SYM_STR(DT_MODULE_SYM_CAT(DT_MODULE_SYMBOL_PREFIX, fn)))
150 #define DT_MODULE_SYM(fn)
152 #define OPTIONAL(return_type, function_name, ...) return_type function_name(__VA_ARGS__) DT_MODULE_SYM(function_name)
153 #define REQUIRED(return_type, function_name, ...) return_type function_name(__VA_ARGS__) DT_MODULE_SYM(function_name)
154 #define DEFAULT(return_type, function_name, ...) return_type function_name(__VA_ARGS__) DT_MODULE_SYM(function_name)
159 #pragma GCC visibility push(default)
164 #pragma GCC visibility pop
#define INCLUDE_API_FROM_MODULE_LOAD
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
Print to stdout when thread is enabled, prefixed with seconds since startup.
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
int dt_module_dt_version()
int dt_module_mod_version()
#define DT_MODULE_SYM(fn)
static int dt_version()
The interface version the HOST expects, in the host's own build configuration.