utilities.h
Go to the documentation of this file.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 #ifndef UTILITIES_HEADER
00029 #define UTILITIES_HEADER
00030
00031
00032 #include <time.h>
00033 #include <sys/time.h>
00034 #include <sys/resource.h>
00035
00036 #ifdef __cplusplus
00037 #define EXTERN_C extern "C"
00038 #else
00039 #define EXTERN_C
00040 #endif
00041
00042
00043 #define MAX_HOST_NAME_LEN 100
00044
00045 typedef struct
00046 {
00047 char s[MAX_HOST_NAME_LEN];
00048 } host_name_struct;
00049
00050 #define MAX_WORKING_DIRECTORY_LEN 800
00051
00052 typedef struct
00053 {
00054 char s[MAX_WORKING_DIRECTORY_LEN];
00055 } working_directory_struct;
00056
00057 EXTERN_C void get_host_name(host_name_struct* result);
00058
00059 EXTERN_C void get_working_directory(working_directory_struct* result);
00060
00061 EXTERN_C int get_memory_usage_by_ps(double* virtualMemoryGigaBytes, double* residentMemoryGigaBytes);
00062
00063 EXTERN_C int get_memory_usage_by_procfile(double* virtualMemGigaBytes,
00064 double* residentMemGigaBytes,
00065 double* virtualMemPeakGigaBytes);
00066
00067 EXTERN_C int generate_unique_random_filename(char* result, unsigned n);
00068
00069 #ifdef __cplusplus
00070 #include <stdexcept>
00071 #include "output.h"
00072 #include "realtype.h"
00073 namespace Util {
00076 class TimeMeter {
00077 private:
00078 double startTimeCPU_sys;
00079 double startTimeCPU_usr;
00080 double startTimeWall;
00081 public:
00082 double get_start_time_wall_seconds() const {
00083 return startTimeWall;
00084 }
00085 static double get_wall_seconds() {
00086 struct timeval tv;
00087 if(gettimeofday(&tv, NULL) != 0)
00088 throw std::runtime_error("Error in get_wall_seconds(), in gettimeofday().");
00089 double seconds = tv.tv_sec + (double)tv.tv_usec / 1000000;
00090 return seconds;
00091 }
00092 static void get_current_cpu_times(double & seconds_usr, double & seconds_sys) {
00093 struct rusage usage;
00094 if(getrusage (RUSAGE_SELF, &usage) != 0)
00095 throw std::runtime_error("Error in get_current_cpu_times(), in getrusage().");
00096 seconds_usr = usage.ru_utime.tv_sec + (double)usage.ru_utime.tv_usec / 1000000;
00097 seconds_sys = usage.ru_stime.tv_sec + (double)usage.ru_stime.tv_usec / 1000000;
00098 }
00099 TimeMeter() {
00100 startTimeWall = get_wall_seconds();
00101 get_current_cpu_times(startTimeCPU_usr, startTimeCPU_sys);
00102 }
00103 void print(int area, const char *routine) {
00104 double endTimeWall = get_wall_seconds();
00105 double secondsTakenWall = endTimeWall - startTimeWall;
00106 double seconds_usr, seconds_sys;
00107 get_current_cpu_times(seconds_usr, seconds_sys);
00108 double secondsTakenCPU_usr = seconds_usr - startTimeCPU_usr;
00109 double secondsTakenCPU_sys = seconds_sys - startTimeCPU_sys;
00110 do_output(LOG_CAT_TIMINGS, area, "%s took %9.2f usr cpu s %9.2f sys cpu s %9.2f wall s",
00111 routine, secondsTakenCPU_usr, secondsTakenCPU_sys, secondsTakenWall);
00112 }
00113
00114
00115 };
00116 }
00117
00118 #endif
00119
00120 #endif