Skip to content
Bitcoin Roots

v31.1-roots.1 · Commit 5: [PATCH 05/17] feat(net): preserve Roots peer controls and health view on v31

src/util/time.cpp

Before: src/util/time.cpp · After: src/util/time.cpp

File metadata
index 9e0715e52509dd9226ce1e7200d2eedfebef4cf7..df9f5ca759133cab245eee94e0d29c3a214a18c6 100644

Download original patch · Release notes

Diff rows 1–56 of 56. Line numbers refer to the original before/after files.

+ Added− RemovedUnmarked lines are context.

Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

src/util/time.cpp CHANGED
@@ -18,6 +18,13 @@
18
  #include <string_view>
19
  #include <thread>
20
 
 
 
 
 
 
 
 
21
  static constexpr std::array<std::string_view, 7> weekdays{"Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed"}; // 1970-01-01 was a Thursday.
22
  static constexpr std::array<std::string_view, 12> months{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
23
 
@@ -151,3 +158,43 @@ struct timeval MillisToTimeval(std::chrono::milliseconds ms)
151
  {
152
  return MillisToTimeval(count_milliseconds(ms));
153
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  #include <string_view>
19
  #include <thread>
20
 
21
+ #ifdef WIN32
22
+ #include <windows.h>
23
+ #include <processthreadsapi.h>
24
+ #else
25
+ #include <ctime>
26
+ #endif
27
+
28
  static constexpr std::array<std::string_view, 7> weekdays{"Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed"}; // 1970-01-01 was a Thursday.
29
  static constexpr std::array<std::string_view, 12> months{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
30
 
 
158
  {
159
  return MillisToTimeval(count_milliseconds(ms));
160
  }
161
+
162
+ std::chrono::nanoseconds ThreadCpuTime()
163
+ {
164
+ #ifdef CLOCK_THREAD_CPUTIME_ID
165
+ timespec t;
166
+ if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t) == -1) {
167
+ return std::chrono::nanoseconds{0};
168
+ }
169
+ return std::chrono::seconds{t.tv_sec} + std::chrono::nanoseconds{t.tv_nsec};
170
+ #elif defined(WIN32)
171
+ FILETIME creation;
172
+ FILETIME exit;
173
+ FILETIME kernel;
174
+ FILETIME user;
175
+ // GetThreadTimes():
176
+ // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getthreadtimes
177
+ if (GetThreadTimes(GetCurrentThread(), &creation, &exit, &kernel, &user) == 0) {
178
+ return std::chrono::nanoseconds{0};
179
+ }
180
+
181
+ // https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime
182
+ // "... you should copy the low- and high-order parts of the file time to a
183
+ // ULARGE_INTEGER structure, perform 64-bit arithmetic on the QuadPart
184
+ // member ..."
185
+
186
+ ULARGE_INTEGER kernel_;
187
+ kernel_.LowPart = kernel.dwLowDateTime;
188
+ kernel_.HighPart = kernel.dwHighDateTime;
189
+
190
+ ULARGE_INTEGER user_;
191
+ user_.LowPart = user.dwLowDateTime;
192
+ user_.HighPart = user.dwHighDateTime;
193
+
194
+ // The units of the returned values from GetThreadTimes() are "100-nanosecond periods".
195
+ // So, we multiply by 100 to get nanoseconds.
196
+ return std::chrono::nanoseconds{(kernel_.QuadPart + user_.QuadPart) * 100};
197
+ #else
198
+ return std::chrono::nanoseconds{0};
199
+ #endif
200
+ }