unit-tests: Change how hashtable for testable functions is created
Because GCC does not adhere to the priorities defined for constructors when building with --enable-monolithic (not sure if it was just luck that it worked in non-monolithic mode - anyway, it's not very portable) function registration would fail because the hashtable would not be created yet.
This commit is contained in:
@@ -22,29 +22,46 @@
|
||||
*/
|
||||
hashtable_t *testable_functions;
|
||||
|
||||
/**
|
||||
* The function that actually initializes the hash table above. Provided
|
||||
* by the test runner.
|
||||
*/
|
||||
void testable_functions_create() __attribute__((weak));
|
||||
|
||||
/*
|
||||
* Described in header.
|
||||
*/
|
||||
void testable_function_register(char *name, void *fn)
|
||||
{
|
||||
if (testable_functions)
|
||||
bool old = FALSE;
|
||||
|
||||
if (!testable_functions_create)
|
||||
{ /* not linked to the test runner */
|
||||
return;
|
||||
}
|
||||
else if (!fn && !testable_functions)
|
||||
{ /* ignore as testable_functions has already been destroyed */
|
||||
return;
|
||||
}
|
||||
|
||||
if (lib && lib->leak_detective)
|
||||
{
|
||||
bool old = FALSE;
|
||||
if (lib->leak_detective)
|
||||
{
|
||||
old = lib->leak_detective->set_state(lib->leak_detective, FALSE);
|
||||
}
|
||||
if (fn)
|
||||
{
|
||||
testable_functions->put(testable_functions, name, fn);
|
||||
}
|
||||
else
|
||||
{
|
||||
testable_functions->remove(testable_functions, name);
|
||||
}
|
||||
if (lib->leak_detective)
|
||||
{
|
||||
lib->leak_detective->set_state(lib->leak_detective, old);
|
||||
}
|
||||
old = lib->leak_detective->set_state(lib->leak_detective, FALSE);
|
||||
}
|
||||
if (!testable_functions)
|
||||
{
|
||||
testable_functions_create();
|
||||
}
|
||||
if (fn)
|
||||
{
|
||||
testable_functions->put(testable_functions, name, fn);
|
||||
}
|
||||
else
|
||||
{
|
||||
testable_functions->remove(testable_functions, name);
|
||||
}
|
||||
if (lib && lib->leak_detective)
|
||||
{
|
||||
lib->leak_detective->set_state(lib->leak_detective, old);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ void testable_function_register(char *name, void *fn);
|
||||
* @param fn function to register
|
||||
*/
|
||||
#define EXPORT_FUNCTION_FOR_TESTS(ns, fn) \
|
||||
static void testable_function_register_##fn() __attribute__ ((constructor(2000))); \
|
||||
static void testable_function_register_##fn() __attribute__ ((constructor)); \
|
||||
static void testable_function_register_##fn() \
|
||||
{ \
|
||||
testable_function_register(#ns "/" #fn, fn); \
|
||||
|
||||
Reference in New Issue
Block a user