1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
ULib/include/ulib/debug/trace.h
stefanocasazza 7731ca80a0 some fix
2015-11-25 18:28:45 +01:00

140 lines
4.7 KiB
C++

// ============================================================================
//
// = LIBRARY
// ULib - c++ library
//
// = FILENAME
// trace.h
//
// = AUTHOR
// Stefano Casazza
//
// ============================================================================
#ifndef ULIB_TRACE_H
#define ULIB_TRACE_H 1
#include <ulib/base/trace.h>
#include <ulib/debug/error_simulation.h>
#define U_MANAGE_RETURN_VALUE(type,format) \
type trace_return_type(type ret) { \
void* ptr_value = USimulationError::checkForMatch(buffer_trace); \
if (ptr_value) \
ret = *(type*)ptr_value; \
trace_return(format, ret); \
return ret; }
#define U_MANAGE_SYSRETURN_VALUE(type,format,error) \
type trace_sysreturn_type(type ret) { \
void* ptr_value = USimulationError::checkForMatch(buffer_syscall); \
if (ptr_value) \
ret = *(type*)ptr_value; \
trace_sysreturn((error), format, ret); \
return ret; }
#ifdef USE_LIBTDB
# include <tdb.h>
typedef struct TDB_DATA tdbdata_t;
#endif
typedef DIR* pdir_t;
typedef void* pvoid_t;
typedef FILE* pfile_t;
typedef const void* pcvoid_t;
typedef char* pchar_t;
typedef const char* pcchar_t;
typedef unsigned char* puchar_t;
typedef const unsigned char* pcuchar_t;
// typedef int (*x11error_t) (void*, void*);
// typedef int (*x11IOerror_t)(void*);
class UCrono;
class U_EXPORT UTrace {
public:
// Initialization and termination methods
UTrace(int level, const char* format, ...);
UTrace(int level, uint32_t len, const char* name);
~UTrace();
char active[1];
char flag_syscall_read_or_write[1];
// trace return from generic call
void trace_return(const char* format, ...);
// manage return from generic call for tipology of value (of return)...
U_MANAGE_RETURN_VALUE(bool, "%b")
U_MANAGE_RETURN_VALUE(char, "%C")
U_MANAGE_RETURN_VALUE(int, "%d")
U_MANAGE_RETURN_VALUE(unsigned int, "%u")
U_MANAGE_RETURN_VALUE(long, "%ld")
U_MANAGE_RETURN_VALUE(unsigned long, "%lu")
U_MANAGE_RETURN_VALUE(long long, "%lld")
U_MANAGE_RETURN_VALUE(unsigned long long, "%llu")
U_MANAGE_RETURN_VALUE(float, "%f")
U_MANAGE_RETURN_VALUE(double, "%g")
U_MANAGE_RETURN_VALUE(long double, "%LG")
U_MANAGE_RETURN_VALUE(void*, "%p")
U_MANAGE_RETURN_VALUE(const void*, "%p")
U_MANAGE_RETURN_VALUE(char*, "%S")
U_MANAGE_RETURN_VALUE(const char*, "%S")
U_MANAGE_RETURN_VALUE(void**, "%p")
U_MANAGE_RETURN_VALUE(char**, "%p")
#ifdef USE_LIBTDB
U_MANAGE_RETURN_VALUE(tdbdata_t, "%J")
#endif
// trace call and return from system call
void trace_syscall( const char* format, ...);
void trace_sysreturn(bool error, const char* format, ...);
// manage return from system call for tipology of value (of return)...
U_MANAGE_SYSRETURN_VALUE(int, "%d", ret == -1)
U_MANAGE_SYSRETURN_VALUE(unsigned int, "%u", ret == 0U)
U_MANAGE_SYSRETURN_VALUE(long, "%ld", ret == -1L)
U_MANAGE_SYSRETURN_VALUE(long long, "%lld", ret == -1LL)
U_MANAGE_SYSRETURN_VALUE(unsigned long, "%lu", ret == 0UL)
U_MANAGE_SYSRETURN_VALUE(unsigned long long, "%llu", ret == 0ULL)
U_MANAGE_SYSRETURN_VALUE(float, "%f", ret == 0.0)
U_MANAGE_SYSRETURN_VALUE(double, "%g", ret == 0.0)
U_MANAGE_SYSRETURN_VALUE(pvoid_t, "%p", ret == 0 ||
ret == (void*)-1)
U_MANAGE_SYSRETURN_VALUE(pcvoid_t, "%p", ret == 0 ||
ret == (const void*)-1)
U_MANAGE_SYSRETURN_VALUE(pchar_t, "%S", ret == 0)
U_MANAGE_SYSRETURN_VALUE(pcchar_t, "%S", ret == 0)
U_MANAGE_SYSRETURN_VALUE(puchar_t, "%S", ret == 0)
U_MANAGE_SYSRETURN_VALUE(pcuchar_t, "%S", ret == 0)
U_MANAGE_SYSRETURN_VALUE(pdir_t, "%p", ret == 0)
U_MANAGE_SYSRETURN_VALUE(pfile_t, "%p", ret == 0)
U_MANAGE_SYSRETURN_VALUE(sighandler_t, "%p", ret == (sighandler_t)SIG_ERR)
#ifdef USE_LIBTDB
U_MANAGE_SYSRETURN_VALUE(tdbdata_t, "%J", false)
#endif
static void resume() { u_trace_suspend = status; }
static void suspend() { status = u_trace_suspend; u_trace_suspend = 1; }
private:
char buffer_trace[1019], buffer_syscall[1019];
uint32_t buffer_trace_len, buffer_syscall_len;
static int status;
static UCrono* time_syscall_read_or_write;
void set(int level) U_NO_EXPORT;
};
#endif