]>
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> | |
7 | ||
8 | #include <sys/mman.h> | |
9 | ||
10 | #include "vm/perf_helpers.h" | |
11 | ||
12 | #define K_CTIME_BUFFER_LEN 26 | |
13 | void | |
14 | benchmark_log(bool verbose, const char *restrict fmt, ...) | |
15 | { | |
16 | time_t now; | |
17 | char time_buffer[K_CTIME_BUFFER_LEN]; | |
18 | struct tm local_time; | |
19 | va_list args; | |
20 | if (verbose) { | |
21 | strncpy(time_buffer, "UNKNOWN", K_CTIME_BUFFER_LEN); | |
22 | ||
23 | now = time(NULL); | |
24 | if (now != -1) { | |
25 | struct tm* ret = localtime_r(&now, &local_time); | |
26 | if (ret == &local_time) { | |
27 | snprintf(time_buffer, K_CTIME_BUFFER_LEN, | |
28 | "%.2d/%.2d/%.2d %.2d:%.2d:%.2d", | |
29 | local_time.tm_mon + 1, local_time.tm_mday, | |
30 | local_time.tm_year + 1900, | |
31 | local_time.tm_hour, local_time.tm_min, | |
32 | local_time.tm_sec); | |
33 | } | |
34 | } | |
35 | ||
36 | printf("%s: ", time_buffer); | |
37 | va_start(args, fmt); | |
38 | vprintf(fmt, args); | |
39 | fflush(stdout); | |
40 | } | |
41 | } | |
42 | ||
43 | uint64_t | |
44 | timespec_difference_us(const struct timespec* a, const struct timespec* b) | |
45 | { | |
46 | assert(a->tv_sec >= b->tv_sec || a->tv_nsec >= b->tv_nsec); | |
47 | long seconds_elapsed = a->tv_sec - b->tv_sec; | |
48 | uint64_t nsec_elapsed; | |
49 | if (b->tv_nsec > a->tv_nsec) { | |
50 | seconds_elapsed--; | |
51 | nsec_elapsed = kNumNanosecondsInSecond - (uint64_t) (b->tv_nsec - a->tv_nsec); | |
52 | } else { | |
53 | nsec_elapsed = (uint64_t) (a->tv_nsec - b->tv_nsec); | |
54 | } | |
55 | return (uint64_t) seconds_elapsed * kNumMicrosecondsInSecond + nsec_elapsed / kNumNanosecondsInMicrosecond; | |
56 | } | |
57 | ||
58 | unsigned char * | |
59 | mmap_buffer(size_t memsize) | |
60 | { | |
61 | int fd = -1; | |
62 | unsigned char* addr = (unsigned char *)mmap(NULL, memsize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, | |
63 | fd, 0); | |
64 | if ((void*) addr == MAP_FAILED) { | |
65 | fprintf(stderr, "Unable to mmap a memory object: %s\n", strerror(errno)); | |
66 | exit(2); | |
67 | } | |
68 | return addr; | |
69 | } |