2012-05-17 20:14:22 +01:00
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <pthread.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <malloc.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include "util.h"
|
|
|
|
|
2012-06-09 02:25:12 +01:00
|
|
|
pthread_key_t cleanup_handler_key;
|
|
|
|
|
|
|
|
int log_level = 1;
|
2012-05-17 20:14:22 +01:00
|
|
|
|
|
|
|
void error_init()
|
|
|
|
{
|
2012-06-09 02:25:12 +01:00
|
|
|
pthread_key_create(&cleanup_handler_key, free);
|
|
|
|
}
|
|
|
|
|
|
|
|
void error_handler(int fatal)
|
|
|
|
{
|
|
|
|
DECLARE_ERROR_CONTEXT(context);
|
|
|
|
|
|
|
|
if (!context) {
|
|
|
|
pthread_exit((void*) 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
longjmp(context->jmp, 1);
|
2012-05-17 20:14:22 +01:00
|
|
|
}
|
|
|
|
|
2012-06-09 02:25:12 +01:00
|
|
|
void mylog(int line_level, const char* format, ...)
|
2012-05-17 20:14:22 +01:00
|
|
|
{
|
|
|
|
va_list argptr;
|
|
|
|
|
2012-06-09 02:25:12 +01:00
|
|
|
if (line_level < log_level)
|
|
|
|
return;
|
2012-05-17 20:14:22 +01:00
|
|
|
|
|
|
|
va_start(argptr, format);
|
|
|
|
vfprintf(stderr, format, argptr);
|
|
|
|
va_end(argptr);
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
void* xrealloc(void* ptr, size_t size)
|
|
|
|
{
|
|
|
|
void* p = realloc(ptr, size);
|
2012-06-09 02:25:12 +01:00
|
|
|
FATAL_IF_NULL(p, "couldn't xrealloc %d bytes", ptr ? "realloc" : "malloc", size);
|
2012-05-17 20:14:22 +01:00
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
void* xmalloc(size_t size)
|
|
|
|
{
|
|
|
|
void* p = xrealloc(NULL, size);
|
|
|
|
memset(p, 0, size);
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|