#ifndef _UTIL_H
#define _UTIL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
extern int _dm_assert(const char *assertion, const char *file, int line,
const char *func);
#if defined(__STDC__)
#if __STDC_VERSION__ - 0 >= 199901L
#define dm_assert(EX) (void)((EX) ? 0 : \
_dm_assert(#EX, __FILE__, __LINE__, __func__))
#else
#define dm_assert(EX) (void)((EX) ? 0 : \
_dm_assert(#EX, __FILE__, __LINE__, NULL))
#endif
#else
#define dm_assert(EX) (void)((EX) ? 0 : \
_dm_assert("EX", __FILE__, __LINE__, NULL))
#endif
struct q_node {
void *data;
struct q_node *next;
};
typedef struct q_head {
boolean_t boe;
pthread_mutex_t mutex;
pthread_cond_t cvar;
void *(*nalloc)(size_t);
void (*nfree)(void *, size_t);
void (*data_dealloc)(void *);
struct q_node *nodep;
} qu_t;
typedef enum log_class {
MM_CONF = 0x0001,
MM_HPMGR = 0x0004,
MM_SCHGMGR = 0x0008,
MM_MAIN = 0x0040,
MM_TOPO = 0x0100,
MM_ERR = 0x0200,
MM_WARN = 0x0400,
MM_NOTE = 0x0800,
MM_OTHER = 0x1000
} log_class_t;
extern void queue_add(qu_t *qp, void *data);
extern void *queue_remove(qu_t *qp);
extern qu_t *new_queue(boolean_t block_on_empty, void *(*nodealloc)(size_t),
void (*nodefree)(void *, size_t), void (*deallocator)(void *));
extern void queue_free(qu_t **qp);
extern void *dmalloc(size_t sz);
extern void *dzmalloc(size_t sz);
extern char *dstrdup(const char *s);
extern void dfree(void *p, size_t sz);
extern void dstrfree(char *s);
extern void log_msg(log_class_t cl, const char *fmt, ...);
extern void log_err(const char *fmt, ...);
extern void log_warn(const char *fmt, ...);
extern void log_warn_e(const char *fmt, ...);
extern void vcont(log_class_t cl, const char *fmt, va_list val);
#ifdef __cplusplus
}
#endif
#endif