let LUMIERA_DIE take an error identifier as parameter
This commit is contained in:
parent
8b162cada4
commit
27ca8a7362
11 changed files with 59 additions and 36 deletions
|
|
@ -25,6 +25,8 @@
|
|||
* @file Condition variables
|
||||
*/
|
||||
|
||||
LUMIERA_ERROR_DEFINE (CONDITION_DESTROY, "condition destroy failed");
|
||||
|
||||
/**
|
||||
* Initialize a condition variable
|
||||
* @param self is a pointer to the condition variable to be initialized
|
||||
|
|
@ -53,9 +55,9 @@ lumiera_condition_destroy (LumieraCondition self)
|
|||
if (self)
|
||||
{
|
||||
if (pthread_mutex_destroy (&self->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_DESTROY);
|
||||
else if (pthread_cond_destroy (&self->cond))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (CONDITION_DESTROY);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
* @file Condition variables, header
|
||||
*/
|
||||
|
||||
LUMIERA_ERROR_DECLARE (CONDITION_DESTROY);
|
||||
|
||||
/**
|
||||
* Condition variables.
|
||||
|
|
@ -59,10 +60,10 @@ lumiera_condition_signal (LumieraCondition self)
|
|||
{
|
||||
REQUIRE (self);
|
||||
if (pthread_mutex_lock (&self->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_LOCK);
|
||||
pthread_cond_signal (&self->cond);
|
||||
if (pthread_mutex_unlock (&self->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_UNLOCK);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -74,10 +75,10 @@ lumiera_condition_broadcast (LumieraCondition self)
|
|||
{
|
||||
REQUIRE (self);
|
||||
if (pthread_mutex_lock (&self->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_LOCK);
|
||||
pthread_cond_broadcast (&self->cond);
|
||||
if (pthread_mutex_unlock (&self->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_UNLOCK);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -124,7 +125,7 @@ lumiera_conditionacquirer_init (LumieraConditionacquirer self, LumieraCondition
|
|||
self->state = state;
|
||||
if (state == LUMIERA_LOCKED)
|
||||
if (pthread_mutex_lock (&cond->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_LOCK);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
|
@ -141,7 +142,7 @@ lumiera_conditionacquirer_lock (LumieraConditionacquirer self)
|
|||
REQUIRE (self->state == LUMIERA_UNLOCKED, "mutex already locked");
|
||||
|
||||
if (pthread_mutex_lock (&self->cond->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_LOCK);
|
||||
|
||||
self->state = LUMIERA_LOCKED;
|
||||
}
|
||||
|
|
@ -172,7 +173,7 @@ lumiera_conditionacquirer_unlock (LumieraConditionacquirer self)
|
|||
REQUIRE (self);
|
||||
REQUIRE (self->state == LUMIERA_LOCKED, "mutex was not locked");
|
||||
if (pthread_mutex_unlock (&self->cond->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_UNLOCK);
|
||||
self->state = LUMIERA_UNLOCKED;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,8 @@ extern "C" {
|
|||
* Abort unconditionally with a 'Fatal Error!' message.
|
||||
* This macro is used whenever the program end up in a invalid state from which no runtime recovery is possible
|
||||
*/
|
||||
#define LUMIERA_DIE do { NOBUG_ERROR(NOBUG_ON, "Fatal Error!"); abort(); } while(0)
|
||||
#define LUMIERA_DIE(err) \
|
||||
do { NOBUG_ERROR(NOBUG_ON, "Fatal Error: %s ", strchr(LUMIERA_ERROR_##err, ':')); abort(); } while(0)
|
||||
|
||||
/**
|
||||
* Forward declare an error constant.
|
||||
|
|
@ -58,7 +59,8 @@ extern const char* LUMIERA_ERROR_##err
|
|||
#define LUMIERA_ERROR_DEFINE(err, msg) \
|
||||
const char* LUMIERA_ERROR_##err = "LUMIERA_ERROR_" #err ":" msg
|
||||
|
||||
/** Helper macro to raise an error for the current thread.
|
||||
/**
|
||||
* Helper macro to raise an error for the current thread.
|
||||
* This macro eases setting an error. It adds NoBug logging support to the low level error handling.
|
||||
* @param flag NoBug flag describing the subsystem where the error was raised
|
||||
* @param err name of the error without the 'LUMIERA_ERROR_' prefix (example: NO_MEMORY)
|
||||
|
|
|
|||
|
|
@ -28,6 +28,11 @@
|
|||
|
||||
#include "lib/error.h"
|
||||
|
||||
|
||||
LUMIERA_ERROR_DECLARE (MUTEX_LOCK);
|
||||
LUMIERA_ERROR_DECLARE (MUTEX_UNLOCK);
|
||||
LUMIERA_ERROR_DECLARE (MUTEX_DESTROY);
|
||||
|
||||
/**
|
||||
* @file Shared declarations for all locking primitives.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -25,6 +25,10 @@
|
|||
* @file Mutual exclusion locking.
|
||||
*/
|
||||
|
||||
LUMIERA_ERROR_DEFINE (MUTEX_LOCK, "Mutex locking failed");
|
||||
LUMIERA_ERROR_DEFINE (MUTEX_UNLOCK, "Mutex unlocking failed");
|
||||
LUMIERA_ERROR_DEFINE (MUTEX_DESTROY, "Mutex destroy failed");
|
||||
|
||||
|
||||
/**
|
||||
* Initialize a mutex variable
|
||||
|
|
@ -52,7 +56,7 @@ lumiera_mutex_destroy (LumieraMutex self)
|
|||
if (self)
|
||||
{
|
||||
if (pthread_mutex_destroy (&self->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_DESTROY);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
* @file Mutual exclusion locking, header.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Mutex.
|
||||
*
|
||||
|
|
@ -106,7 +105,7 @@ lumiera_mutexacquirer_init_mutex (LumieraMutexacquirer self, LumieraMutex mutex,
|
|||
self->state = state;
|
||||
if (state == LUMIERA_LOCKED)
|
||||
if (pthread_mutex_lock (&mutex->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_LOCK);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
|
@ -124,7 +123,7 @@ lumiera_mutexacquirer_lock (LumieraMutexacquirer self)
|
|||
REQUIRE (self->state == LUMIERA_UNLOCKED, "mutex already locked");
|
||||
|
||||
if (pthread_mutex_lock (&self->mutex->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_LOCK);
|
||||
|
||||
self->state = LUMIERA_LOCKED;
|
||||
}
|
||||
|
|
@ -164,7 +163,7 @@ lumiera_mutexacquirer_try_mutex (LumieraMutexacquirer self, LumieraMutex mutex)
|
|||
case EBUSY:
|
||||
return LUMIERA_UNLOCKED;
|
||||
default:
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_LOCK);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -180,7 +179,7 @@ lumiera_mutexacquirer_unlock (LumieraMutexacquirer self)
|
|||
REQUIRE (self);
|
||||
REQUIRE (self->state == LUMIERA_LOCKED, "mutex was not locked");
|
||||
if (pthread_mutex_unlock (&self->mutex->mutex))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (MUTEX_UNLOCK);
|
||||
self->state = LUMIERA_UNLOCKED;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,8 +25,10 @@
|
|||
#include <dlfcn.h>
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "plugin.h"
|
||||
#include "safeclib.h"
|
||||
|
||||
/**
|
||||
* @file Plugin loader.
|
||||
|
|
@ -159,8 +161,8 @@ lumiera_plugin_lookup (struct lumiera_plugin* self, const char* path)
|
|||
{
|
||||
/* got it */
|
||||
TRACE (lumiera_plugin, "found %s", pathname);
|
||||
self->pathname = strdup (pathname);
|
||||
if (!self->pathname) LUMIERA_DIE;
|
||||
self->pathname = lumiera_strndup (pathname, PATH_MAX);
|
||||
|
||||
self->type = lumiera_plugin_extensions[i].type;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -195,21 +197,20 @@ lumiera_interface_open (const char* name, const char* interface, size_t min_revi
|
|||
plugin.name = name; /* for searching */
|
||||
|
||||
found = tsearch (&plugin, &lumiera_plugin_registry, lumiera_plugin_name_cmp);
|
||||
if (!found) LUMIERA_DIE;
|
||||
if (!found)
|
||||
LUMIERA_DIE (NO_MEMORY);
|
||||
|
||||
if (*found == &plugin)
|
||||
{
|
||||
NOTICE (lumiera_plugin, "new plugin");
|
||||
|
||||
/* now really create new item */
|
||||
*found = malloc (sizeof (struct lumiera_plugin));
|
||||
if (!*found) LUMIERA_DIE;
|
||||
*found = lumiera_malloc (sizeof (struct lumiera_plugin));
|
||||
|
||||
if (name) /* NULL is main app, no lookup needed */
|
||||
{
|
||||
/*lookup for $LUMIERA_PLUGIN_PATH*/
|
||||
(*found)->name = strdup (name);
|
||||
if (!(*found)->name) LUMIERA_DIE;
|
||||
(*found)->name = lumiera_strndup (name, PATH_MAX);
|
||||
|
||||
if (!!lumiera_plugin_lookup (*found, getenv("LUMIERA_PLUGIN_PATH"))
|
||||
#ifdef LUMIERA_PLUGIN_PATH
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include "lib/references.h"
|
||||
#include "lib/safeclib.h"
|
||||
|
||||
/**
|
||||
* @file Strong and Weak references
|
||||
|
|
@ -43,8 +44,7 @@
|
|||
LumieraReference
|
||||
lumiera_reference_strong_init_once (LumieraReference self, void* obj, void (*dtor)(void*))
|
||||
{
|
||||
LumieraReftarget target = malloc (sizeof(lumiera_reftarget));
|
||||
if (!target) LUMIERA_DIE;
|
||||
LumieraReftarget target = lumiera_malloc (sizeof(lumiera_reftarget));
|
||||
|
||||
target->object = obj;
|
||||
target->dtor = dtor;
|
||||
|
|
|
|||
|
|
@ -25,6 +25,10 @@
|
|||
|
||||
LUMIERA_ERROR_DEFINE(RWLOCK_AGAIN, "maximum number of readlocks exceed");
|
||||
LUMIERA_ERROR_DEFINE(RWLOCK_DEADLOCK, "deadlock detected");
|
||||
LUMIERA_ERROR_DEFINE(RWLOCK_DESTROY, "destroy rwlock");
|
||||
LUMIERA_ERROR_DEFINE(RWLOCK_UNLOCK, "unlock");
|
||||
LUMIERA_ERROR_DEFINE(RWLOCK_RLOCK, "rlock");
|
||||
LUMIERA_ERROR_DEFINE(RWLOCK_WLOCK, "wlock");
|
||||
|
||||
/**
|
||||
* @file Read/write locks.
|
||||
|
|
@ -57,7 +61,7 @@ lumiera_rwlock_destroy (LumieraRWLock self)
|
|||
if (self)
|
||||
{
|
||||
if (pthread_rwlock_destroy (&self->rwlock))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (RWLOCK_DESTROY);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
|
@ -95,7 +99,7 @@ lumiera_rwlockacquirer_init (LumieraRWLockacquirer self, LumieraRWLock rwlock, e
|
|||
lumiera_error_set (LUMIERA_ERROR_RWLOCK_DEADLOCK);
|
||||
return NULL;
|
||||
default:
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (RWLOCK_RLOCK);
|
||||
}
|
||||
case LUMIERA_WRLOCKED:
|
||||
switch (pthread_rwlock_wrlock (&rwlock->rwlock))
|
||||
|
|
@ -106,7 +110,7 @@ lumiera_rwlockacquirer_init (LumieraRWLockacquirer self, LumieraRWLock rwlock, e
|
|||
lumiera_error_set (LUMIERA_ERROR_RWLOCK_DEADLOCK);
|
||||
return NULL;
|
||||
default:
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (RWLOCK_WLOCK);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
|
|
@ -138,7 +142,7 @@ lumiera_rwlockacquirer_rdlock (LumieraRWLockacquirer self)
|
|||
lumiera_error_set (LUMIERA_ERROR_RWLOCK_DEADLOCK);
|
||||
return NULL;
|
||||
default:
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (RWLOCK_RLOCK);
|
||||
}
|
||||
|
||||
self->state = LUMIERA_RDLOCKED;
|
||||
|
|
@ -166,7 +170,7 @@ lumiera_rwlockacquirer_wrlock (LumieraRWLockacquirer self)
|
|||
lumiera_error_set (LUMIERA_ERROR_RWLOCK_DEADLOCK);
|
||||
return NULL;
|
||||
default:
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (RWLOCK_WLOCK);
|
||||
}
|
||||
|
||||
self->state = LUMIERA_WRLOCKED;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,10 @@
|
|||
|
||||
LUMIERA_ERROR_DECLARE(RWLOCK_AGAIN);
|
||||
LUMIERA_ERROR_DECLARE(RWLOCK_DEADLOCK);
|
||||
LUMIERA_ERROR_DECLARE(RWLOCK_DESTROY);
|
||||
LUMIERA_ERROR_DECLARE(RWLOCK_UNLOCK);
|
||||
LUMIERA_ERROR_DECLARE(RWLOCK_RLOCK);
|
||||
LUMIERA_ERROR_DECLARE(RWLOCK_WLOCK);
|
||||
|
||||
/**
|
||||
* @file Read/write locks, header.
|
||||
|
|
@ -106,7 +110,7 @@ lumiera_rwlockacquirer_unlock (LumieraRWLockacquirer self)
|
|||
REQUIRE (self);
|
||||
REQUIRE (self->state != LUMIERA_UNLOCKED, "rwlock was not locked");
|
||||
if (pthread_rwlock_unlock (&self->rwlock->rwlock))
|
||||
LUMIERA_DIE;
|
||||
LUMIERA_DIE (RWLOCK_UNLOCK);
|
||||
self->state = LUMIERA_UNLOCKED;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include "lib/plugin.h"
|
||||
#include "hello_interface.h"
|
||||
|
||||
LUMIERA_ERROR_DEFINE(FAILURE, "test failure");
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
|
|
@ -25,7 +26,7 @@ main(int argc, char** argv)
|
|||
LUMIERA_INTERFACE_TYPE(hello, 1)* hello_de =
|
||||
(LUMIERA_INTERFACE_TYPE(hello, 1)*) lumiera_interface_open ("example_plugin", "german_1", sizeof(LUMIERA_INTERFACE_TYPE(hello, 1)));
|
||||
|
||||
if (!hello_de) LUMIERA_DIE;
|
||||
if (!hello_de) LUMIERA_DIE (FAILURE);
|
||||
|
||||
hello_de->hello();
|
||||
hello_de->goodbye(argv[1]);
|
||||
|
|
@ -33,7 +34,7 @@ main(int argc, char** argv)
|
|||
LUMIERA_INTERFACE_TYPE(hello, 1)* hello_en =
|
||||
(LUMIERA_INTERFACE_TYPE(hello, 1)*) lumiera_interface_open ("example_plugin", "english_1", sizeof(LUMIERA_INTERFACE_TYPE(hello, 1)));
|
||||
|
||||
if (!hello_en) LUMIERA_DIE;
|
||||
if (!hello_en) LUMIERA_DIE (FAILURE);
|
||||
|
||||
hello_en->hello();
|
||||
hello_en->goodbye(argv[1]);
|
||||
|
|
@ -48,7 +49,7 @@ main(int argc, char** argv)
|
|||
LUMIERA_INTERFACE_TYPE(hello, 1)* hello_de =
|
||||
(LUMIERA_INTERFACE_TYPE(hello, 1)*) lumiera_interface_open ("example_plugin_cpp", "german_1", sizeof(LUMIERA_INTERFACE_TYPE(hello, 1)));
|
||||
|
||||
if (!hello_de) LUMIERA_DIE;
|
||||
if (!hello_de) LUMIERA_DIE (FAILURE);
|
||||
|
||||
hello_de->hello();
|
||||
hello_de->goodbye(argv[1]);
|
||||
|
|
@ -56,7 +57,7 @@ main(int argc, char** argv)
|
|||
LUMIERA_INTERFACE_TYPE(hello, 1)* hello_en =
|
||||
(LUMIERA_INTERFACE_TYPE(hello, 1)*) lumiera_interface_open ("example_plugin_cpp", "english_1", sizeof(LUMIERA_INTERFACE_TYPE(hello, 1)));
|
||||
|
||||
if (!hello_en) LUMIERA_DIE;
|
||||
if (!hello_en) LUMIERA_DIE (FAILURE);
|
||||
|
||||
hello_en->hello();
|
||||
hello_en->goodbye(argv[1]);
|
||||
|
|
|
|||
Loading…
Reference in a new issue