00001 #ifndef QOS_FUNC_H_
00002 #define QOS_FUNC_H_
00003
00004 #include "qos_debug.h"
00005 #include "qos_prof.h"
00006
00007
00008 #ifdef QOS_FUNC_WRAPPERS
00009
00010 #ifndef QOS_FUNC_MAX_ARGS_SIZE
00011
00021 # define QOS_FUNC_MAX_ARGS_SIZE 64
00022 #endif
00023
00024 typedef void (* __void_func)(void);
00025
00031 #define qos_func_define(rv, name, params...) \
00032 rv name(params); \
00033 static rv name##__(params); \
00034 rv name(params) { \
00035 void *__func_args, *__func_rv; \
00036 qos_log_debug("Entering function: " #name); \
00037 if (indent_lev < MAX_INDENT_LEVEL) \
00038 func_names[indent_lev] = #name; \
00039 indent_lev++; \
00040 __func_args = __builtin_apply_args(); \
00041 __func_rv = __builtin_apply((__void_func) name##__, __func_args, QOS_FUNC_MAX_ARGS_SIZE); \
00042 indent_lev--; \
00043 qos_log_debug("Leaving function: " #name); \
00044 __builtin_return(__func_rv); \
00045 } \
00046 static rv name##__(params)
00047
00048 #define qos_func_define_prof(rv, name, params...) \
00049 static rv name##__(params); \
00050 rv name(params) { \
00051 void *__func_args, *__func_rv; \
00052 prof_vars; \
00053 qos_log_debug("Entering function: " #name); \
00054 if (indent_lev < MAX_INDENT_LEVEL) \
00055 func_names[indent_lev] = #name; \
00056 indent_lev++; \
00057 __func_args = __builtin_apply_args(); \
00058 prof_func(); \
00059 __func_rv = __builtin_apply((__void_func) name##__, __func_args, QOS_FUNC_MAX_ARGS_SIZE); \
00060 prof_end(); \
00061 indent_lev--; \
00062 qos_log_debug("Leaving function: " #name); \
00063 __builtin_return(__func_rv); \
00064 } \
00065 static rv name##__(params)
00066
00067 #define qos_trblock(rv, name) \
00068 rv name(void); \
00069 static rv name##__(void); \
00070 rv name(void) { \
00071 void *__func_args, *__func_rv; \
00072 qos_log_debug("Entering function: " #name); \
00073 if (indent_lev < MAX_INDENT_LEVEL) \
00074 func_names[indent_lev] = #name; \
00075 indent_lev++; \
00076 __func_args = __builtin_apply_args(); \
00077 __func_rv = __builtin_apply((__void_func) name##__, __func_args, 0); \
00078 indent_lev--; \
00079 qos_log_debug("Leaving function: " #name); \
00080 __builtin_return(__func_rv); \
00081 } \
00082 static rv name##__(void)
00083
00084 #else
00085
00086 #define qos_func_define(rv, name, params...) \
00087 rv name(params)
00088
00089 #define qos_func_define_prof(rv, name, params...) \
00090 rv name(params)
00091
00092 #endif
00093
00094 #endif