00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00037 #ifndef UTILITIES_HEADER
00038 #define UTILITIES_HEADER
00039
00040
00041 #include <time.h>
00042 #include <sys/time.h>
00043 #include <sys/resource.h>
00044
00045
00046 #define MAX_HOST_NAME_LEN 100
00047
00048 typedef struct
00049 {
00050 char s[MAX_HOST_NAME_LEN];
00051 } host_name_struct;
00052
00053 #define MAX_WORKING_DIRECTORY_LEN 800
00054
00055 typedef struct
00056 {
00057 char s[MAX_WORKING_DIRECTORY_LEN];
00058 } working_directory_struct;
00059
00060 void get_host_name(host_name_struct* result);
00061
00062 void get_working_directory(working_directory_struct* result);
00063
00064 int get_memory_usage_by_ps(double* virtualMemoryGigaBytes, double* residentMemoryGigaBytes);
00065
00066 int get_memory_usage_by_procfile(double* virtualMemGigaBytes,
00067 double* residentMemGigaBytes,
00068 double* virtualMemPeakGigaBytes);
00069
00070 int generate_unique_random_filename(char* result, unsigned n);
00071
00072 long int get_file_size(const char* fileName);
00073
00074 #include <stdexcept>
00075 #include "output.h"
00076 #include "realtype.h"
00077 namespace Util {
00080 class TimeMeter {
00081 private:
00082 double startTimeCPU_sys;
00083 double startTimeCPU_usr;
00084 double startTimeWall;
00085 public:
00086 double get_start_time_wall_seconds() const {
00087 return startTimeWall;
00088 }
00089 static double get_wall_seconds() {
00090 struct timeval tv;
00091 if(gettimeofday(&tv, NULL) != 0)
00092 throw std::runtime_error("Error in get_wall_seconds(), in gettimeofday().");
00093 double seconds = tv.tv_sec + (double)tv.tv_usec / 1000000;
00094 return seconds;
00095 }
00096 static void get_current_cpu_times(double & seconds_usr, double & seconds_sys) {
00097 struct rusage usage;
00098 if(getrusage (RUSAGE_SELF, &usage) != 0)
00099 throw std::runtime_error("Error in get_current_cpu_times(), in getrusage().");
00100 seconds_usr = usage.ru_utime.tv_sec + (double)usage.ru_utime.tv_usec / 1000000;
00101 seconds_sys = usage.ru_stime.tv_sec + (double)usage.ru_stime.tv_usec / 1000000;
00102 }
00103 TimeMeter() {
00104 startTimeWall = get_wall_seconds();
00105 get_current_cpu_times(startTimeCPU_usr, startTimeCPU_sys);
00106 }
00107 double get_elapsed_wall_seconds() {
00108 double endTimeWall = get_wall_seconds();
00109 return endTimeWall - startTimeWall;
00110 }
00111 void print(int area, const char *routine) {
00112 double endTimeWall = get_wall_seconds();
00113 double secondsTakenWall = endTimeWall - startTimeWall;
00114 double seconds_usr, seconds_sys;
00115 get_current_cpu_times(seconds_usr, seconds_sys);
00116 double secondsTakenCPU_usr = seconds_usr - startTimeCPU_usr;
00117 double secondsTakenCPU_sys = seconds_sys - startTimeCPU_sys;
00118 do_output(LOG_CAT_TIMINGS, area, "%s took %9.2f usr cpu s %9.2f sys cpu s %9.2f wall s",
00119 routine, secondsTakenCPU_usr, secondsTakenCPU_sys, secondsTakenWall);
00120 }
00121
00122
00123 };
00124 }
00125
00126
00127 #endif