@@ -38,48 +38,64 @@ static const int GPUMeter_attributes[] = {
38
38
GPU_RESIDUE ,
39
39
};
40
40
41
- static int humanTimeUnit (char * buffer , size_t size , unsigned long long int value ) {
41
+ static int humanTimeUnit (char * buffer , size_t size , unsigned long long totalNanoseconds ) {
42
+ if (totalNanoseconds < 10000 )
43
+ return xSnprintf (buffer , size , "%4uns" , (unsigned int )totalNanoseconds );
42
44
43
- if (value < 1000 )
44
- return xSnprintf (buffer , size , "%3lluns" , value );
45
-
46
- if (value < 10000 )
47
- return xSnprintf (buffer , size , "%1llu.%1lluus" , value / 1000 , (value % 1000 ) / 100 );
48
-
49
- value /= 1000 ;
45
+ unsigned long long value = totalNanoseconds / 100 ;
50
46
51
47
if (value < 1000 )
52
- return xSnprintf (buffer , size , "%3lluus" , value );
48
+ return xSnprintf (buffer , size , "%u.%uus" , (unsigned int )(value / 10 ), (unsigned int )(value % 10 ));
49
+
50
+ value /= 10 ; // microseconds
53
51
54
52
if (value < 10000 )
55
- return xSnprintf (buffer , size , "%1llu.%1llums" , value / 1000 , (value % 1000 ) / 100 );
53
+ return xSnprintf (buffer , size , "%4uus" , (unsigned int )value );
54
+
55
+ value /= 100 ;
56
+
57
+ unsigned long long totalSeconds = value / 10000 ;
58
+ if (totalSeconds < 60 ) {
59
+ int width = 4 ;
60
+ unsigned int seconds = (unsigned int )totalSeconds ;
61
+ unsigned int fraction = (unsigned int )(value % 10000 );
62
+ for (unsigned int limit = 1 ; seconds >= limit ; limit *= 10 ) {
63
+ width -- ;
64
+ fraction /= 10 ;
65
+ }
66
+ // "%.u" prints no digits if (seconds == 0).
67
+ return xSnprintf (buffer , size , "%.u.%0*us" , seconds , width , fraction );
68
+ }
56
69
57
- value /= 1000 ;
70
+ value = totalSeconds ;
58
71
59
- if (value < 1000 )
60
- return xSnprintf (buffer , size , "%3llums " , value );
72
+ if (value < 3600 )
73
+ return xSnprintf (buffer , size , "%2um%02us " , ( unsigned int ) value / 60 , ( unsigned int ) value % 60 );
61
74
62
- if (value < 10000 )
63
- return xSnprintf (buffer , size , "%1llu.%1llus" , value / 1000 , (value % 1000 ) / 100 );
75
+ value /= 60 ; // minutes
76
+
77
+ if (value < 1440 )
78
+ return xSnprintf (buffer , size , "%2uh%02um" , (unsigned int )value / 60 , (unsigned int )value % 60 );
64
79
65
- value /= 1000 ;
80
+ value /= 60 ; // hours
66
81
67
- if (value < 600 )
68
- return xSnprintf (buffer , size , "%3llus " , value );
82
+ if (value < 2400 )
83
+ return xSnprintf (buffer , size , "%2ud%02uh " , ( unsigned int ) value / 24 , ( unsigned int ) value % 24 );
69
84
70
- value /= 60 ;
85
+ value /= 24 ; // days
71
86
72
- if (value < 600 )
73
- return xSnprintf (buffer , size , "%3llum " , value );
87
+ if (value < 365 )
88
+ return xSnprintf (buffer , size , "%5ud " , ( unsigned int ) value );
74
89
75
- value /= 60 ;
90
+ if (value < 3650 )
91
+ return xSnprintf (buffer , size , "%uy%03ud" , (unsigned int )(value / 365 ), (unsigned int )(value % 365 ));
76
92
77
- if (value < 96 )
78
- return xSnprintf (buffer , size , "%3lluh" , value );
93
+ value /= 365 ; // years (ignore leap years)
79
94
80
- value /= 24 ;
95
+ if (value < 100000 )
96
+ return xSnprintf (buffer , size , "%5luy" , (unsigned long )value );
81
97
82
- return xSnprintf (buffer , size , "%3llud" , value );
98
+ return xSnprintf (buffer , size , " inf." );
83
99
}
84
100
85
101
static void GPUMeter_updateValues (Meter * this ) {
0 commit comments