00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #pragma once
00022
00023 #include <drizzled/session.h>
00024 #include <drizzled/util/storable.h>
00025
00026 namespace performance_dictionary {
00027
00028 #define USAGE_MAX_KEPT 5
00029
00030 struct query_usage {
00031 std::string query;
00032 struct rusage start;
00033 struct rusage buffer;
00034
00035 query_usage()
00036 {
00037 memset(&start, 0, sizeof(struct rusage));
00038 memset(&buffer, 0, sizeof(struct rusage));
00039 }
00040
00041 void set(const std::string &sql, const struct rusage &arg)
00042 {
00043 if (getrusage(RUSAGE_THREAD, &buffer))
00044 {
00045 memset(&start, 0, sizeof(struct rusage));
00046 memset(&buffer, 0, sizeof(struct rusage));
00047 return;
00048 }
00049 query= sql.substr(0, 512);
00050 start= arg;
00051
00052 buffer.ru_utime.tv_sec -= start.ru_utime.tv_sec;
00053 buffer.ru_utime.tv_usec -= start.ru_utime.tv_usec;
00054
00055 buffer.ru_stime.tv_sec -= start.ru_stime.tv_sec;
00056 buffer.ru_stime.tv_usec -= start.ru_stime.tv_usec;
00057
00058 buffer.ru_maxrss -= start.ru_maxrss;
00059 buffer.ru_ixrss -= start.ru_ixrss;
00060 buffer.ru_idrss -= start.ru_idrss;
00061 buffer.ru_isrss -= start.ru_isrss;
00062 buffer.ru_minflt -= start.ru_minflt;
00063 buffer.ru_majflt -= start.ru_majflt;
00064 buffer.ru_nswap -= start.ru_nswap;
00065 buffer.ru_inblock -= start.ru_inblock;
00066 buffer.ru_oublock -= start.ru_oublock;
00067 buffer.ru_msgsnd -= start.ru_msgsnd;
00068 buffer.ru_msgrcv -= start.ru_msgrcv;
00069 buffer.ru_nsignals -= start.ru_nsignals;
00070 buffer.ru_nvcsw -= start.ru_nvcsw;
00071 buffer.ru_nivcsw -= start.ru_nivcsw;
00072 }
00073
00074 const struct rusage &delta(void) const
00075 {
00076 return buffer;
00077 }
00078
00079 ~query_usage()
00080 { }
00081 };
00082
00083 typedef std::list <query_usage> Query_list;
00084
00085 class QueryUsage : public drizzled::util::Storable
00086 {
00087 public:
00088 Query_list query_list;
00089
00090 QueryUsage()
00091 {
00092 query_list.resize(USAGE_MAX_KEPT);
00093 }
00094
00095 void push(drizzled::Session::QueryString query_string, const struct rusage &arg);
00096
00097 Query_list &list(void)
00098 {
00099 return query_list;
00100 }
00101 };
00102
00103
00104 }
00105