00001 #ifndef __QOS_DEBUG_H__
00002 #define __QOS_DEBUG_H__
00003
00014
00015
00016
00017
00032 typedef struct __qos_rv { } *qos_rv;
00033
00034 #define qos_rv_int(rv) ((int) (long) (rv))
00035 #define qos_int_rv(err) ((qos_rv) (long) err)
00036
00038 #define QOS_OK qos_int_rv(0)
00039
00040 #define QOS_E_GENERIC qos_int_rv(-16)
00041
00042 #define QOS_E_NO_MEMORY qos_int_rv(-17)
00043
00044 #define QOS_E_INVALID_PARAM qos_int_rv(-18)
00045
00047 #define QOS_E_UNAUTHORIZED qos_int_rv(-19)
00048
00049 #define QOS_E_UNIMPLEMENTED qos_int_rv(-20)
00050
00051 #define QOS_E_MISSING_COMPONENT qos_int_rv(-21)
00052
00053 #define QOS_E_INCONSISTENT_STATE qos_int_rv(-22)
00054
00055 #define QOS_E_SYSTEM_OVERLOAD qos_int_rv(-23)
00056
00057 #define QOS_E_INTERNAL_ERROR qos_int_rv(-24)
00058
00059 #define QOS_E_NOT_FOUND qos_int_rv(-25)
00060
00061 #define QOS_E_FULL qos_int_rv(-26)
00062
00063 #define QOS_E_EMPTY qos_int_rv(-27)
00064
00068 #define QOS_E_NOSERVER QOS_E_NOT_FOUND
00069
00072 #ifdef QOS_KS
00073
00074 # include <linux/kernel.h>
00075 # include <linux/version.h>
00076 # include <linux/module.h>
00077 # include <asm/atomic.h>
00078 # include "kal_time.h"
00079 # define QOS_FFLUSH
00080 # ifdef __LOGGER__
00081 # include "logger.h"
00082 # define debug_print log_printf
00083 # define DBG_DEV 0,
00084 # define DBG_LEV
00085 # else
00086 # define debug_print printk
00087 # define DBG_LEV KERN_DEBUG
00088 # define DBG_DEV
00089 # endif
00090 # define QOS_DEBUG_WITH_TIME
00091 # ifdef QOS_DEBUG_WITH_TIME
00092 extern kal_time_t sched_time;
00093 # define DBG_TIME_FORMAT KAL_TIME_FMT
00094 # define DBG_TIME KAL_TIME_FMT_ARG(kal_time_now()),
00095 # else
00096 # define DBG_TIME_FORMAT
00097 # define DBG_TIME
00098 # endif
00099 #else
00100 # include <stdio.h>
00101 # include <unistd.h>
00102 # include <stdlib.h>
00103 # define debug_print fprintf
00104 # define DBG_LEV
00105 # define DBG_DEV stderr,
00106 # define QOS_FFLUSH fflush(stderr)
00107 # define DBG_TIME_FORMAT
00108 # define DBG_TIME
00109
00110
00111 # define atomic_t int
00112 # define ATOMIC_INIT(x) (x)
00113 # define atomic_inc_return(p) (++(*(p)))
00114 #endif
00115
00116 #ifndef QOS_GLOBAL_LEVEL
00117 # define QOS_GLOBAL_LEVEL QOS_LEVEL_DEBUG
00118 #endif
00119
00121 extern atomic_t qos_log_msg_id;
00122
00126 extern int indent_lev;
00127
00128 #define MAX_INDENT_LEVEL 32
00129 extern char * func_names[MAX_INDENT_LEVEL];
00130
00131 void qos_dump_stack(void);
00132
00138 char *qos_strerror(qos_rv err);
00139
00140 #define _min(a, b) ((a) < (b) ? (a) : (b))
00141 #define _max(a, b) ((a) > (b) ? (a) : (b))
00142
00143 #define pad "+ + + + + + + + + + + + + + + + "
00144
00146 #define qos_log_str(level,str,msg,args...) \
00147 do { \
00148 int __level = (level); \
00149 if (__level <= QOS_DEBUG_LEVEL && __level <= QOS_GLOBAL_LEVEL) { \
00150 debug_print(DBG_LEV DBG_DEV DBG_TIME_FORMAT \
00151 "[%6d]" "[%.24s%*s]" str " %.*s" msg "\n", \
00152 DBG_TIME \
00153 atomic_inc_return(&qos_log_msg_id), __func__, \
00154 24-_min(24, (int)sizeof(__func__)-1), "", \
00155 2*indent_lev, pad, ##args); \
00156 QOS_FFLUSH; \
00157 } \
00158 } while (0)
00159
00160
00161
00163 #define qos_log_simple(level,msg,args...) \
00164 do { \
00165 if ((level) <= QOS_DEBUG_LEVEL) { \
00166 debug_print(DBG_LEV DBG_DEV msg "\n", ##args); \
00167 QOS_FFLUSH; \
00168 } \
00169 } while (0)
00170
00174 #define QOS_LEVEL_NODEBUG 0
00175
00181 #define QOS_LEVEL_ERROR 1
00182
00188 #define QOS_LEVEL_WARN 2
00189
00196 #define QOS_LEVEL_INFO 3
00197
00202 #define QOS_LEVEL_DEBUG 4
00203
00208 #define QOS_LEVEL_VERB 8
00209
00210 #ifndef QOS_DEBUG_LEVEL
00211
00216 # define QOS_DEBUG_LEVEL QOS_LEVEL_WARN
00217 #endif
00218
00220 #define qos_log(level,msg,args...) qos_log_str(level,"",msg,##args)
00221
00223 #define qos_log_err(msg,args...) qos_log_str(QOS_LEVEL_ERROR, "<ERR> ",msg,##args)
00224
00226 #define qos_log_warn(msg,args...) qos_log_str(QOS_LEVEL_WARN, "<WRN> ",msg,##args)
00227
00229 #define qos_log_info(msg,args...) qos_log_str(QOS_LEVEL_INFO, "<INF> ",msg,##args)
00230
00232 #define qos_log_debug(msg,args...) qos_log_str(QOS_LEVEL_DEBUG, "<DBG> ",msg,##args)
00233
00235 #define qos_log_verb(msg,args...) qos_log_str(QOS_LEVEL_VERB, "<VRB> ",msg,##args)
00236
00239 #define qos_log_var(level, __var_name, __var_type) qos_log(level, #__var_name ": " __var_type, __var_name)
00240
00242 #define qos_log_crit(msg,args...) \
00243 do { \
00244 debug_print(DBG_LEV DBG_DEV "[%15s] <CRIT> " msg "\n", __func__ , ##args); \
00245 QOS_FFLUSH; \
00246 } while (0)
00247
00248 #ifdef QOS_KS
00249 # define DUMP_STACK do { dump_stack(); qos_dump_stack(); } while (0)
00250 #else
00251 # define DUMP_STACK do { qos_dump_stack(); } while (0)
00252 #endif
00253
00254 #define qos_chk_do_msg(cond, stmt, msg, args...) do { \
00255 if (!(cond)) { \
00256 qos_log_crit("ASSERTION '" #cond "' FAILED " \
00257 "at line %d of file %s: " msg, __LINE__, __FILE__, ##args); \
00258 stmt; \
00259 } \
00260 } while (0)
00261
00262 #define qos_chk_do(cond, stmt) qos_chk_do_msg(cond, stmt, "")
00263
00269 #define qos_chk_msg(cond, msg, args...) qos_chk_do_msg(cond, , msg, ##args)
00270
00275 #define qos_chk(cond) qos_chk_do(cond, )
00276
00283 #define qos_chk_rv(cond,rv) qos_chk_do(cond, return rv)
00284
00290 #define qos_return_if_cond(cond,rv,msg,args...) do { \
00291 if (cond) { \
00292 qos_log_debug("Check failed: '" #cond \
00293 "' at line %d of file %s. " msg "\n", __LINE__, __FILE__,##args); \
00294 return rv; \
00295 } \
00296 } while (0)
00297
00298 #define qos_chk_ok_do(expr,stmt) do { \
00299 qos_rv __rv = (expr); \
00300 if (__rv != QOS_OK) { \
00301 qos_log_crit("ASSERTION FAILED: '" #expr " = %s' at line %d of file %s.",\
00302 qos_strerror(__rv), __LINE__, __FILE__); \
00303 DUMP_STACK; \
00304 stmt; \
00305 } \
00306 } while (0)
00307
00313 #define qos_chk_ok(expr) qos_chk_ok_do(expr, )
00314
00320 #define qos_chk_ok_ret(expr) do { \
00321 qos_rv __rv = (expr); \
00322 if (__rv != QOS_OK) { \
00323 qos_log_crit("Check failed: '" #expr " = %s' at line %d of file %s.",\
00324 qos_strerror(__rv), __LINE__, __FILE__); \
00325 DUMP_STACK; \
00326 return __rv; \
00327 } \
00328 } while (0)
00329
00335 #define qos_chk_go(cond,lab) qos_chk_do(cond,goto lab)
00336
00337 #define qos_chk_go_msg(cond,lab,msg,args...) qos_chk_do_msg(cond,goto lab,msg,##args)
00338
00340 #define qos_debug_enabled_for(lev) (QOS_DEBUG_LEVEL >= (lev))
00341
00342 #ifdef QOS_KS
00343
00344 #else
00345
00350 #define qos_chk_exit(cond) do { \
00351 int ok = (cond); \
00352 if (! ok) { \
00353 qos_log_err("ASSERTION FAILED: '" #cond "' at line %d of file %s.",\
00354 __LINE__, __FILE__); \
00355 exit(-1); \
00356 } \
00357 } while (0)
00358
00363 #define qos_chk_ok_exit(expr) qos_chk_ok_do(expr, exit(-1))
00364
00365 #endif
00366
00367 #endif