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:
Tobias Brunner
2014-03-20 15:29:27 +01:00
parent d151cd283e
commit f51169eb09
3 changed files with 49 additions and 28 deletions
+35 -18
View File
@@ -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);
}
}