00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _XENO_NUCLEUS_STAT_H
00022 #define _XENO_NUCLEUS_STAT_H
00023
00024 #ifdef CONFIG_XENO_OPT_STATS
00025
00026 #include <nucleus/types.h>
00027
00028 typedef struct xnstat_exectime {
00029
00030 xnticks_t start;
00031
00032 xnticks_t total;
00033
00034 } xnstat_exectime_t;
00035
00036
00037
00038 #define xnstat_exectime_now() xnarch_get_cpu_tsc()
00039
00040
00041 #define xnstat_exectime_update(sched, date) \
00042 do { \
00043 (sched)->current_account->total += \
00044 date - (sched)->last_account_switch; \
00045 (sched)->last_account_switch = date; \
00046
00047 \
00048 xnarch_memory_barrier(); \
00049 } while (0)
00050
00051
00052 #define xnstat_exectime_set_current(sched, new_account) \
00053 ({ \
00054 xnstat_exectime_t *__prev; \
00055 __prev = xnarch_atomic_xchg(&(sched)->current_account, (new_account)); \
00056 __prev; \
00057 })
00058
00059
00060 #define xnstat_exectime_get_current(sched) ((sched)->current_account)
00061
00062
00063
00064 #define xnstat_exectime_finalize(sched, new_account) \
00065 do { \
00066 (sched)->last_account_switch = xnarch_get_cpu_tsc(); \
00067 (sched)->current_account = (new_account); \
00068 } while (0)
00069
00070
00071 #define xnstat_exectime_get_start(account) ((account)->start)
00072 #define xnstat_exectime_get_total(account) ((account)->total)
00073
00074
00075 #define xnstat_exectime_get_last_switch(sched) ((sched)->last_account_switch)
00076
00077
00078
00079 #define xnstat_exectime_reset_stats(stat) \
00080 do { \
00081 (stat)->total = 0; \
00082 (stat)->start = xnarch_get_cpu_tsc(); \
00083 } while (0)
00084
00085
00086 typedef struct xnstat_counter {
00087 int counter;
00088 } xnstat_counter_t;
00089
00090 static inline int xnstat_counter_inc(xnstat_counter_t *c)
00091 {
00092 return c->counter++;
00093 }
00094
00095 static inline int xnstat_counter_get(xnstat_counter_t *c)
00096 {
00097 return c->counter;
00098 }
00099
00100 static inline void xnstat_counter_set(xnstat_counter_t *c, int value)
00101 {
00102 c->counter = value;
00103 }
00104
00105 #else
00106 typedef struct xnstat_exectime {
00107 #ifdef __XENO_SIM__
00108 int dummy;
00109 #endif
00110 } xnstat_exectime_t;
00111
00112 #define xnstat_exectime_now() ({ 0; })
00113 #define xnstat_exectime_update(sched, date) do { } while (0)
00114 #define xnstat_exectime_set_current(sched, new_account) ({ (void)sched; NULL; })
00115 #define xnstat_exectime_get_current(sched) ({ (void)sched; NULL; })
00116 #define xnstat_exectime_finalize(sched, new_account) do { } while (0)
00117 #define xnstat_exectime_get_start(account) ({ 0; })
00118 #define xnstat_exectime_get_total(account) ({ 0; })
00119 #define xnstat_exectime_get_last_switch(sched) ({ 0; })
00120 #define xnstat_exectime_reset_stats(account) do { } while (0)
00121
00122 typedef struct xnstat_counter {
00123 #ifdef __XENO_SIM__
00124 int dummy;
00125 #endif
00126 } xnstat_counter_t;
00127
00128 #define xnstat_counter_inc(c) ({ 0; })
00129 #define xnstat_counter_get(c) ({ 0; })
00130 #define xnstat_counter_set(c, value) do { } while (0)
00131 #endif
00132
00133
00134
00135 #define xnstat_exectime_switch(sched, new_account) \
00136 ({ \
00137 xnstat_exectime_update(sched, xnstat_exectime_now()); \
00138 xnstat_exectime_set_current(sched, new_account); \
00139 })
00140
00141
00142
00143 #define xnstat_exectime_lazy_switch(sched, new_account, date) \
00144 ({ \
00145 xnstat_exectime_update(sched, date); \
00146 xnstat_exectime_set_current(sched, new_account); \
00147 })
00148
00149 #endif