include/nucleus/stat.h

00001 /*
00002  * Copyright (C) 2006 Jan Kiszka <jan.kiszka@web.de>.
00003  * Copyright (C) 2006 Dmitry Adamushko <dmitry.adamushko@gmail.com>.
00004  *
00005  * Xenomai is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published
00007  * by the Free Software Foundation; either version 2 of the License,
00008  * or (at your option) any later version.
00009  *
00010  * Xenomai is distributed in the hope that it will be useful, but
00011  * WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with Xenomai; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
00018  * 02111-1307, USA.
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;   /* Start of execution time accumulation */
00031 
00032         xnticks_t total; /* Accumulated execution time */
00033 
00034 } xnstat_runtime_t;
00035 
00036 /* Return current date which can be passed to other xnstat services for
00037    immediate or lazy accounting. */
00038 #define xnstat_runtime_now() xnarch_get_cpu_tsc()
00039 
00040 /* Accumulate runtime of the current account until the given date. */
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 } while (0)
00047 
00048 /* Update the current account reference, returning the previous one. */
00049 #define xnstat_runtime_set_current(sched, new_account) \
00050 ({ \
00051         xnstat_runtime_t *__prev; \
00052         __prev = xnarch_atomic_xchg(&(sched)->current_account, (new_account)); \
00053         __prev; \
00054 })
00055 
00056 /* Return the currently active accounting entity. */
00057 #define xnstat_runtime_get_current(sched) ((sched)->current_account)
00058 
00059 /* Finalize an account (no need to accumulate the runtime, just mark the
00060    switch date and set the new account). */
00061 #define xnstat_runtime_finalize(sched, new_account) \
00062 do { \
00063         (sched)->last_account_switch = xnarch_get_cpu_tsc(); \
00064         (sched)->current_account = (new_account); \
00065 } while (0)
00066 
00067 /* Reset statistics from inside the accounted entity (e.g. after CPU
00068    migration). */
00069 #define xnstat_runtime_reset_stats(stat) \
00070 do { \
00071         (stat)->total = 0; \
00072         (stat)->start = xnarch_get_cpu_tsc(); \
00073 } while (0)
00074 
00075 
00076 typedef struct xnstat_counter {
00077         int counter;
00078 } xnstat_counter_t;
00079 
00080 static inline int xnstat_counter_inc(xnstat_counter_t *c) {
00081         return c->counter++;
00082 }
00083 
00084 static inline int xnstat_counter_get(xnstat_counter_t *c) {
00085         return c->counter;
00086 }
00087 
00088 #else /* !CONFIG_XENO_OPT_STATS */
00089 typedef struct xnstat_runtime {
00090 } xnstat_runtime_t;
00091 
00092 #define xnstat_runtime_now()                                 0
00093 #define xnstat_runtime_update(sched, start)                  do { } while (0)
00094 #define xnstat_runtime_set_current(sched, new_account)       ({ NULL; })
00095 #define xnstat_runtime_get_current(sched)                    ({ NULL; })
00096 #define xnstat_runtime_finalize(sched, new_account)          do { } while (0)
00097 #define xnstat_runtime_reset_stats(account)                  do { } while (0)
00098 
00099 typedef struct xnstat_counter {
00100 } xnstat_counter_t;
00101 
00102 static inline int xnstat_counter_inc(xnstat_counter_t *c) { return 0; }
00103 static inline int xnstat_counter_get(xnstat_counter_t *c) { return 0; }
00104 #endif /* CONFIG_XENO_OPT_STATS */
00105 
00106 /* Account the runtime of the current account until now, switch to
00107    new_account, and return the previous one. */
00108 #define xnstat_runtime_switch(sched, new_account) \
00109 ({ \
00110         xnstat_runtime_update(sched, xnstat_runtime_now()); \
00111         xnstat_runtime_set_current(sched, new_account); \
00112 })
00113 
00114 /* Account the runtime of the current account until given start time, switch
00115    to new_account, and return the previous one. */
00116 #define xnstat_runtime_lazy_switch(sched, new_account, start) \
00117 ({ \
00118         xnstat_runtime_update(sched, start); \
00119         xnstat_runtime_set_current(sched, new_account); \
00120 })
00121 
00122 #endif /* !_XENO_NUCLEUS_STAT_H */

Generated on Mon Dec 25 13:57:10 2006 for Xenomai API by  doxygen 1.4.6