00001 #ifndef __QMGR_TIME_H__
00002 #define __QMGR_TIME_H__
00003
00009 #include <linux/aquosa/qos_types.h>
00010
00011 #ifndef QOS_KS
00012
00013 # include <aquosa/qres_lib.h>
00014 # include <time.h>
00015 # include <sys/time.h>
00016 #else
00017
00018 # include <linux/aquosa/qres_gw_ks.h>
00019 #endif
00020
00022 typedef struct qmgr_time_t {
00023 struct timespec old_abs_time;
00024 qres_time_t old_exec_time;
00025 struct timespec abs_time;
00026 qres_time_t exec_time;
00027 } qmgr_time_t;
00028
00030 static inline void timespec_add(struct timespec *dst_ts, struct timespec *src1_ts, struct timespec *src2_ts) {
00031 dst_ts->tv_sec = src1_ts->tv_sec + src2_ts->tv_sec;
00032 dst_ts->tv_nsec = src1_ts->tv_nsec + src2_ts->tv_nsec;
00033 long int delta_ns = dst_ts->tv_nsec - 1000000000lu;
00034 if (delta_ns >= 0) {
00035 dst_ts->tv_nsec = delta_ns;
00036 dst_ts->tv_sec++;
00037 }
00038 }
00039
00044 static inline void timespec_sub(struct timespec *dst_ts, struct timespec *src1_ts, struct timespec *src2_ts) {
00045 dst_ts->tv_sec = src1_ts->tv_sec - src2_ts->tv_sec;
00046 dst_ts->tv_nsec = src1_ts->tv_nsec - src2_ts->tv_nsec;
00047 if (dst_ts->tv_nsec < 0) {
00048 dst_ts->tv_nsec = dst_ts->tv_nsec + 1000000000lu;
00049 dst_ts->tv_sec--;
00050 }
00051 }
00052
00054 static inline signed long timespec_sub_us(struct timespec *ts2, struct timespec *ts1) {
00055 return (ts2->tv_sec - ts1->tv_sec) * 1000000l + ((signed long) (ts2->tv_nsec - ts1->tv_nsec)) / 1000l;
00056 }
00057
00059 static void qmgr_time_init(qmgr_time_t *self);
00060
00066 static qres_time_t qmgr_time_get_elapsed(qmgr_time_t *self);
00067
00074 static qres_time_t qmgr_time_get_exec(qmgr_time_t *self);
00075
00076
00077
00078
00079
00081 static void qmgr_time_tick_xs(qres_time_t *p_exec_time, struct timespec *p_abs_time) {
00082 #ifndef QOS_KS
00083 qres_sid_t sid;
00084 qres_get_sid(0, 0, &sid);
00085 clock_gettime(CLOCK_MONOTONIC, p_abs_time);
00086 qres_get_exec_time(sid, p_exec_time, NULL);
00087 #else
00088 struct timespec now;
00089 qres_atime_t now2;
00090 qres_server_t *srv = qres_find_by_rres(rres_find_by_task(current));
00091 clock_gettime(CLOCK_MONOTONIC, &now);
00092 *p_abs_time = now;
00093 qres_get_exec_abs_time(srv, p_exec_time, &now2);
00094 #endif
00095 }
00096
00097 static inline void qmgr_time_init(qmgr_time_t *self) {
00098 self->exec_time = 0;
00099 self->abs_time.tv_sec = 0;
00100 self->abs_time.tv_nsec = 0;
00101 }
00102
00103 static inline void qmgr_time_tick(qmgr_time_t *self) {
00104 self->old_exec_time = self->exec_time;
00105 self->old_abs_time = self->abs_time;
00106 qmgr_time_tick_xs(&self->exec_time, &self->abs_time);
00107 }
00108
00109
00110 static inline qres_time_t qmgr_time_get_elapsed(qmgr_time_t *self) {
00111 return timespec_sub_us(&self->abs_time, &self->old_abs_time);
00112 }
00113
00114
00115 static inline qres_time_t qmgr_time_get_exec(qmgr_time_t *self) {
00116 return self->exec_time - self->old_exec_time;
00117 }
00118
00120 static inline struct timespec qmgr_time_get_abs_time(qmgr_time_t *self) {
00121 return self->abs_time;
00122 }
00123
00124 #endif