/* Copyright (c) 2002, Thomas Kurschel Part of Radeon driver Fast logger As syslog is very slow and tends to loose data if its buffer overflows (which occurs much too often), this module provides a fast (and memory- wasting) logging mechanism. You need a seperate application to retrieve the log. Everything is thread-safe. */ #ifndef __LOG_COLL_H__ #define __LOG_COLL_H__ #include // by undefining this flag, all logging functions // are resolved to empty space, so don't add // extra tests in your code #undef ENABLE_LOGGING //#define ENABLE_LOGGING // add log entry with 0..3 (uint32) data #define LOG( li, what ) log( li, what, 0 ) #define LOG1( li, what, arg1 ) log( li, what, 1, arg1 ); #define LOG2( li, what, arg1, arg2 ) log( li, what, 2, arg1, arg2 ); #define LOG3( li, what, arg1, arg2, arg3 ) log( li, what, 3, arg1, arg2, arg3 ); // one log entry typedef struct log_entry_t { uint64 tsc; uint16 what; uint8 num_args; uint32 args[1]; } log_entry; struct log_info_t; #if defined(__cplusplus) extern "C" { #endif #ifdef ENABLE_LOGGING void log( struct log_info_t *li, uint16 what, const uint8 num_args, ... ); #else #define log( a, b, c... ) #endif // define LOG_INCLUDE_STARTUP in your device driver #ifdef LOG_INCLUDE_STARTUP uint32 log_getsize( struct log_info_t *li ); void log_getcopy( struct log_info_t *li, void *dest, uint32 max_size ); #ifdef ENABLE_LOGGING struct log_info_t *log_init( uint32 size ); void log_exit( struct log_info_t *li ); #else #define log_init( a ) NULL #define log_exit( a ) #endif #endif #if defined(__cplusplus) } #endif #endif