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_runtime {
00029
00030 xnticks_t start;
00031
00032 xnticks_t total;
00033
00034 } xnstat_runtime_t;
00035
00036
00037
00038 #define xnstat_runtime_now() xnarch_get_cpu_tsc()
00039
00040
00041 #define xnstat_runtime_update(sched, start) \
00042 do { \
00043 (sched)->current_account->total += \
00044 start - (sched)->last_account_switch; \
00045 (sched)->last_account_switch = start; \
00046
00047 \
00048 xnarch_memory_barrier(); \
00049 } while (0)
00050
00051
00052 #define xnstat_runtime_set_current(sched, new_account) \
00053 ({ \
00054 xnstat_runtime_t *__prev; \
00055 __prev = xnarch_atomic_xchg(&(sched)->current_account, (new_account)); \
00056 __prev; \
00057 })
00058
00059
00060 #define xnstat_runtime_get_current(sched) ((sched)->current_account)
00061
00062
00063
00064 #define xnstat_runtime_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
00072 #define xnstat_runtime_reset_stats(stat) \
00073 do { \
00074 (stat)->total = 0; \
00075 (stat)->start = xnarch_get_cpu_tsc(); \
00076 } while (0)
00077
00078
00079 typedef struct xnstat_counter {
00080 int counter;
00081 } xnstat_counter_t;
00082
00083 static inline int xnstat_counter_inc(xnstat_counter_t *c) {
00084 return c->counter++;
00085 }
00086
00087 static inline int xnstat_counter_get(xnstat_counter_t *c) {
00088 return c->counter;
00089 }
00090
00091 #else
00092 typedef struct xnstat_runtime {
00093 } xnstat_runtime_t;
00094
00095 #define xnstat_runtime_now() 0
00096 #define xnstat_runtime_update(sched, start) do { } while (0)
00097 #define xnstat_runtime_set_current(sched, new_account) ({ NULL; })
00098 #define xnstat_runtime_get_current(sched) ({ NULL; })
00099 #define xnstat_runtime_finalize(sched, new_account) do { } while (0)
00100 #define xnstat_runtime_reset_stats(account) do { } while (0)
00101
00102 typedef struct xnstat_counter {
00103 } xnstat_counter_t;
00104
00105 static inline int xnstat_counter_inc(xnstat_counter_t *c) { return 0; }
00106 static inline int xnstat_counter_get(xnstat_counter_t *c) { return 0; }
00107 #endif
00108
00109
00110
00111 #define xnstat_runtime_switch(sched, new_account) \
00112 ({ \
00113 xnstat_runtime_update(sched, xnstat_runtime_now()); \
00114 xnstat_runtime_set_current(sched, new_account); \
00115 })
00116
00117
00118
00119 #define xnstat_runtime_lazy_switch(sched, new_account, start) \
00120 ({ \
00121 xnstat_runtime_update(sched, start); \
00122 xnstat_runtime_set_current(sched, new_account); \
00123 })
00124
00125 #endif