]>
Commit | Line | Data |
---|---|---|
f427ee49 A |
1 | #include <assert.h> |
2 | #include <errno.h> | |
3 | #include <stdarg.h> | |
4 | #include <stdio.h> | |
5 | #include <stdlib.h> | |
6 | #include <string.h> | |
c3c9b80d | 7 | #include <sys/sysctl.h> |
f427ee49 A |
8 | |
9 | #include <sys/mman.h> | |
10 | ||
c3c9b80d | 11 | #include "benchmark/helpers.h" |
f427ee49 A |
12 | |
13 | #define K_CTIME_BUFFER_LEN 26 | |
14 | void | |
15 | benchmark_log(bool verbose, const char *restrict fmt, ...) | |
16 | { | |
17 | time_t now; | |
18 | char time_buffer[K_CTIME_BUFFER_LEN]; | |
19 | struct tm local_time; | |
20 | va_list args; | |
21 | if (verbose) { | |
22 | strncpy(time_buffer, "UNKNOWN", K_CTIME_BUFFER_LEN); | |
23 | ||
24 | now = time(NULL); | |
25 | if (now != -1) { | |
26 | struct tm* ret = localtime_r(&now, &local_time); | |
27 | if (ret == &local_time) { | |
28 | snprintf(time_buffer, K_CTIME_BUFFER_LEN, | |
29 | "%.2d/%.2d/%.2d %.2d:%.2d:%.2d", | |
30 | local_time.tm_mon + 1, local_time.tm_mday, | |
31 | local_time.tm_year + 1900, | |
32 | local_time.tm_hour, local_time.tm_min, | |
33 | local_time.tm_sec); | |
34 | } | |
35 | } | |
36 | ||
37 | printf("%s: ", time_buffer); | |
38 | va_start(args, fmt); | |
39 | vprintf(fmt, args); | |
40 | fflush(stdout); | |
41 | } | |
42 | } | |
43 | ||
44 | uint64_t | |
45 | timespec_difference_us(const struct timespec* a, const struct timespec* b) | |
46 | { | |
47 | assert(a->tv_sec >= b->tv_sec || a->tv_nsec >= b->tv_nsec); | |
48 | long seconds_elapsed = a->tv_sec - b->tv_sec; | |
49 | uint64_t nsec_elapsed; | |
50 | if (b->tv_nsec > a->tv_nsec) { | |
51 | seconds_elapsed--; | |
52 | nsec_elapsed = kNumNanosecondsInSecond - (uint64_t) (b->tv_nsec - a->tv_nsec); | |
53 | } else { | |
54 | nsec_elapsed = (uint64_t) (a->tv_nsec - b->tv_nsec); | |
55 | } | |
56 | return (uint64_t) seconds_elapsed * kNumMicrosecondsInSecond + nsec_elapsed / kNumNanosecondsInMicrosecond; | |
57 | } | |
58 | ||
59 | unsigned char * | |
60 | mmap_buffer(size_t memsize) | |
61 | { | |
62 | int fd = -1; | |
63 | unsigned char* addr = (unsigned char *)mmap(NULL, memsize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, | |
64 | fd, 0); | |
65 | if ((void*) addr == MAP_FAILED) { | |
66 | fprintf(stderr, "Unable to mmap a memory object: %s\n", strerror(errno)); | |
67 | exit(2); | |
68 | } | |
69 | return addr; | |
70 | } | |
c3c9b80d A |
71 | |
72 | int | |
73 | get_ncpu(void) | |
74 | { | |
75 | int ncpu; | |
76 | size_t length = sizeof(ncpu); | |
77 | ||
78 | int ret = sysctlbyname("hw.ncpu", &ncpu, &length, NULL, 0); | |
79 | if (ret == -1) { | |
80 | fprintf(stderr, "failed to query hw.ncpu"); | |
81 | exit(1); | |
82 | } | |
83 | return ncpu; | |
84 | } |