Commit | Line | Data |
---|---|---|
b25a8868 DG |
1 | /* |
2 | * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca> | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; only version 2 | |
7 | * of the License. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program; if not, write to the Free Software | |
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
17 | */ | |
18 | ||
19 | #include <stdio.h> | |
20 | #include <string.h> | |
21 | #include <sys/time.h> | |
22 | #include <unistd.h> | |
23 | ||
24 | #include "benchmark.h" | |
25 | ||
3c6bae61 DG |
26 | FILE *fp; |
27 | static double g_freq; | |
b25a8868 | 28 | |
3c6bae61 | 29 | static double calibrate_cpu_freq(void) |
b25a8868 | 30 | { |
b25a8868 | 31 | int i, nb_calib = 10; |
3c6bae61 DG |
32 | double freq; |
33 | ||
34 | printf("CPU frequency calibration, this should take 10 seconds\n"); | |
35 | ||
36 | /* CPU Frequency calibration */ | |
37 | for (i = 0; i < nb_calib; i++) { | |
38 | freq += (double) get_cpu_freq(); | |
39 | } | |
40 | return (freq / (double)nb_calib); | |
41 | } | |
42 | ||
43 | static void close_logs(void) | |
44 | { | |
45 | fclose(fp); | |
46 | } | |
b25a8868 | 47 | |
3c6bae61 DG |
48 | static void open_logs(void) |
49 | { | |
50 | fp = fopen(RESULTS_FILE_NAME, "a"); | |
b25a8868 DG |
51 | if (fp == NULL) { |
52 | perror("fopen benchmark"); | |
b25a8868 | 53 | } |
3c6bae61 | 54 | } |
b25a8868 | 55 | |
3c6bae61 DG |
56 | static double get_bench_time(cycles_t before, cycles_t after) |
57 | { | |
58 | double ret; | |
59 | ||
60 | ret = (((double)(after - before) / (g_freq / 1000.0)) / 1000000000.0); | |
61 | ||
62 | return ret; | |
63 | } | |
64 | ||
65 | void bench_init(void) | |
66 | { | |
67 | open_logs(); | |
68 | if (g_freq == 0) { | |
69 | g_freq = calibrate_cpu_freq(); | |
70 | //fprintf(fp, "CPU frequency %f Ghz\n\n", g_freq); | |
71 | } | |
72 | } | |
73 | ||
74 | void bench_close(void) | |
75 | { | |
76 | close_logs(); | |
77 | printf("Benchmark results in %s\n", RESULTS_FILE_NAME); | |
78 | } | |
79 | ||
80 | double bench_get_create_session(void) | |
81 | { | |
82 | if ((time_create_session_start == 0) && | |
83 | (time_create_session_end == 0)) { | |
84 | fprintf(fp, "NO DATA\n"); | |
85 | return 0; | |
86 | } | |
87 | ||
88 | return get_bench_time(time_create_session_start, time_create_session_end); | |
89 | } | |
90 | ||
91 | double bench_get_destroy_session(void) | |
92 | { | |
93 | if ((time_destroy_session_start == 0) && | |
94 | (time_destroy_session_end == 0)) { | |
95 | fprintf(fp, "NO DATA\n"); | |
96 | return 0; | |
b25a8868 | 97 | } |
b25a8868 | 98 | |
3c6bae61 DG |
99 | return get_bench_time(time_destroy_session_start, time_destroy_session_end); |
100 | } | |
b25a8868 | 101 | |
3c6bae61 DG |
102 | /* |
103 | * Log results of the sessiond boot process. | |
104 | * | |
105 | * Uses all time_sessiond_* values (see measures.h) | |
106 | */ | |
107 | void bench_print_boot_process(void) | |
108 | { | |
109 | double res; | |
110 | double global_boot_time = 0.0; | |
111 | ||
112 | fprintf(fp, "--- Session daemon boot process ---\n"); | |
b25a8868 | 113 | |
3c6bae61 | 114 | res = get_bench_time(time_sessiond_boot_start, time_sessiond_boot_end); |
b25a8868 DG |
115 | |
116 | fprintf(fp, "Boot time inside main() from start to first pthread_join (blocking state)\n"); | |
117 | fprintf(fp, "Time: %.20f sec.\n", res); | |
118 | ||
119 | global_boot_time += res; | |
120 | ||
3c6bae61 | 121 | res = get_bench_time(time_sessiond_th_kern_start, time_sessiond_th_kern_poll); |
b25a8868 DG |
122 | |
123 | fprintf(fp, "Boot time of the kernel thread from start to poll() (ready state)\n"); | |
124 | fprintf(fp, "Time: %.20f sec.\n", res); | |
125 | ||
126 | global_boot_time += res; | |
127 | ||
3c6bae61 | 128 | res = get_bench_time(time_sessiond_th_apps_start, time_sessiond_th_apps_poll); |
b25a8868 DG |
129 | |
130 | fprintf(fp, "Boot time of the application thread from start to poll() (ready state)\n"); | |
131 | fprintf(fp, "Time: %.20f sec.\n", res); | |
132 | ||
133 | global_boot_time += res; | |
134 | ||
3c6bae61 | 135 | res = get_bench_time(time_sessiond_th_cli_start, time_sessiond_th_cli_poll); |
b25a8868 DG |
136 | |
137 | fprintf(fp, "Boot time of the client thread from start to poll() (ready state)\n"); | |
138 | fprintf(fp, "Time: %.20f sec.\n", res); | |
139 | ||
140 | global_boot_time += res; | |
141 | ||
142 | fprintf(fp, "Global Boot Time of ltt-sessiond: %0.20f sec.\n", global_boot_time); | |
b25a8868 | 143 | } |