DAWN/src/include/utils.h
Ian Clowes c83306410c treewide: rework mutex
Wrap mutex calls with traceable messages to help debugging resource locks.

[cleanup commit message]
Signed-off-by: Nick Hainke <vincent@systemli.org>
2022-06-11 20:02:03 +02:00

119 lines
3.9 KiB
C

#ifndef __DAWN_UTILS_H
#define __DAWN_UTILS_H
#include <stdint.h>
#include <syslog.h>
#include <pthread.h>
/**
* Check if a string is greater than another one.
* @param str
* @param str_2
* @return
*/
int string_is_greater(char *str, char *str_2);
/*
** Log handling for dawn process
*/
#define DAWNLOG_DEST_SYSLOG 0 // Send log output to syslog...
#define DAWNLOG_DEST_STDIO 1 // ... or stdout / stderr as appropriate
#define DAWNLOG_PERROR 0x08 // Bit flag to signal inclusion of errno from system calls
#define DAWNLOG_PRIMASK 0x07 // Bitmask to obtain only priority value
#define DAWNLOG_ERROR 5 // Serious malfunction / unexpected behaviour - eg: OS resource exhaustion
#define DAWNLOG_WARNING 4 // Something appears wrong, but recoverable - eg: data structures inconsistent
#define DAWNLOG_ALWAYS 3 // Standard behaviour always worth reporting - should be very low frequency messages
#define DAWNLOG_INFO 2 // Reporting on standard behaviour - should be comprehensible to user
#define DAWNLOG_TRACE 1 // More info to help trace where algorithms may be going wrong
#define DAWNLOG_DEBUG 0 // Deeper tracing to fix bugs
#define DAWNLOG_COMPILE_MIN DAWNLOG_DEBUG // Messages lower than this priority are not compiled
#define DAWNLOG_COMPILING(level) (level >= DAWNLOG_COMPILE_MIN)
#define dawnlog_perror(s, ...) dawnlog(DAWNLOG_ERROR|DAWNLOG_PERROR, "%s()=%s@%d %s - " s, __func__, dawnlog_basename(__FILE__), __LINE__, dawnlog_pbuf, ##__VA_ARGS__)
#define dawnlog_error(fmt, ...) dawnlog(DAWNLOG_ERROR, "%s()=%s@%d " fmt, __func__, dawnlog_basename(__FILE__), __LINE__, ##__VA_ARGS__)
#define dawnlog_warning(fmt, ...) dawnlog(DAWNLOG_WARNING, fmt, ##__VA_ARGS__)
#define dawnlog_always(fmt, ...) dawnlog(DAWNLOG_ALWAYS, fmt, ##__VA_ARGS__)
#if DAWNLOG_COMPILING(DAWNLOG_INFO)
#define dawnlog_info(fmt, ...) dawnlog(DAWNLOG_INFO, fmt, ##__VA_ARGS__)
#else
#define dawnlog_info(fmt, ...)
#endif
// Use the ..._func variants to get source code position added automatically: function, filename, line
#if DAWNLOG_COMPILING(DAWNLOG_TRACE)
#define dawnlog_trace(fmt, ...) dawnlog(DAWNLOG_TRACE, fmt, ##__VA_ARGS__)
#define dawnlog_trace_func(fmt, ...) dawnlog(DAWNLOG_TRACE, "%s()=%s@%d " fmt, __func__, dawnlog_basename(__FILE__), __LINE__, ##__VA_ARGS__)
#else
#define dawnlog_trace(fmt, ...)
#define dawnlog_trace_func(fmt, ...)
#endif
#if DAWNLOG_COMPILING(DAWNLOG_DEBUG)
#define dawnlog_debug(fmt, ...) dawnlog(DAWNLOG_DEBUG, fmt, ##__VA_ARGS__)
#define dawnlog_debug_func(fmt, ...) dawnlog(DAWNLOG_DEBUG, "%s()=%s@%d " fmt, __func__, dawnlog_basename(__FILE__), __LINE__, ##__VA_ARGS__)
#else
#define dawnlog_debug(fmt, ...)
#define dawnlog_debug_func(fmt, ...)
#endif
extern char dawnlog_pbuf[]; // Buffer for errno conversion for dawnlog_perror()
/**
* Set the output target for dawnlog()
* @param logdest: DAWNLOG_DEST_*
*/
void dawnlog_dest(int logdest);
/**
* Minimum priority level to be logged
* @param level: A priority level
*/
void dawnlog_minlevel(int level);
/**
* Check whether a priority level would be actually logged to allow callers
* to skip "expensive" preparation such as string manipulation or loops
* @param level
* @return TRUE if the priority level would be logged
*/
int dawnlog_showing(int level);
/**
* Log a message.
* @param level
* @param fmt
* @return
*/
void dawnlog(int level, const char* fmt, ...);
/**
* Return pointer to filename part of full path.
* @param file
* @return
*/
const char* dawnlog_basename(const char* file);
/**
** Wrap mutex operations to help track down mis-matches
*/
#define DAWN_MUTEX_WRAP
#ifndef DAWN_MUTEX_WRAP
#define dawn_mutex_lock(m) pthread_mutex_lock(m)
#define dawn_mutex_unlock(m) pthread_mutex_unlock(m)
#else
#define dawn_mutex_lock(m) _dawn_mutex_lock(m, __FILE__, __LINE__)
int _dawn_mutex_lock(pthread_mutex_t* m, char* f, int l);
#define dawn_mutex_unlock(m) _dawn_mutex_unlock(m, __FILE__, __LINE__)
int _dawn_mutex_unlock(pthread_mutex_t* m, char* f, int l);
#endif
#endif