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 #include <nucleus/types.h>  
00025 
00026 #ifdef CONFIG_XENO_OPT_STATS
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         unsigned long counter;
00088 } xnstat_counter_t;
00089 
00090 static inline unsigned long xnstat_counter_inc(xnstat_counter_t *c)
00091 {
00092         return c->counter++;
00093 }
00094 
00095 static inline unsigned long 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, unsigned long 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) ({ do { } while(0); 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