1 /*
2  # This file is part of the Astrometry.net suite.
3  # Licensed under a 3-clause BSD style license - see LICENSE
4  */
5 
6 #include <time.h>
7 #include <sys/time.h>
8 #include <sys/resource.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include <stdint.h>
13 
14 #include "tic.h"
15 #include "errors.h"
16 #include "log.h"
17 
18 static time_t starttime;
19 static double starttime2;
20 static double startutime, startstime;
21 
timenow()22 double timenow() {
23     struct timeval tv;
24     if (gettimeofday(&tv, NULL)) {
25         ERROR("Failed to get time of day");
26         return -1.0;
27     }
28     return (double)(tv.tv_sec - 3600*24*365*30) + tv.tv_usec * 1e-6;
29 }
30 
millis_between(struct timeval * tv1,struct timeval * tv2)31 double millis_between(struct timeval* tv1, struct timeval* tv2) {
32     return
33         (tv2->tv_usec - tv1->tv_usec)*1e-3 +
34         (tv2->tv_sec  - tv1->tv_sec )*1e3;
35 }
36 
tic()37 void tic() {
38     starttime = time(NULL);
39     starttime2 = timenow();
40     if (get_resource_stats(&startutime, &startstime, NULL)) {
41         ERROR("Failed to get_resource_stats()");
42         return;
43     }
44 }
45 
get_resource_stats(double * p_usertime,double * p_systime,long * p_maxrss)46 int get_resource_stats(double* p_usertime, double* p_systime, long* p_maxrss) {
47     struct rusage usage;
48     if (getrusage(RUSAGE_SELF, &usage)) {
49         SYSERROR("Failed to get resource stats (getrusage)");
50         return 1;
51     }
52     if (p_usertime) {
53         *p_usertime = usage.ru_utime.tv_sec + 1e-6 * usage.ru_utime.tv_usec;
54     }
55     if (p_systime) {
56         *p_systime = usage.ru_stime.tv_sec + 1e-6 * usage.ru_stime.tv_usec;
57     }
58     if (p_maxrss) {
59         *p_maxrss = usage.ru_maxrss;
60     }
61     return 0;
62 }
63 
toc()64 void toc() {
65     double utime, stime;
66     long rss;
67     //int dtime;
68     double dtime2;
69     //time_t endtime = time(NULL);
70     //dtime = (int)(endtime - starttime);
71     dtime2 = timenow() - starttime2;
72     if (get_resource_stats(&utime, &stime, &rss)) {
73         ERROR("Failed to get_resource_stats()");
74         return;
75     }
76     logmsg("Used %g s user, %g s system (%g s total), %g s wall time since last check\n",
77            utime-startutime, stime-startstime, (utime + stime)-(startutime+startstime), dtime2);
78 }
79