2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include "report-generator.h"
24 #include "err-check.h"
25 #include "appinfo-provider.h"
29 struct report_generator_system {
30 /** system cpu usage statistics */
31 struct stats_system previous;
34 struct report_generator_process
38 /** process cpu usage statistics */
39 struct stats_process previous;
42 struct report_generator_app
45 report_generator_process_t *process_gen;
48 int _app_report_generator_setup_process_generator(report_generator_app_t *generator);
50 report_generator_system_t *report_generator_new_system_report_generator()
52 report_generator_system_t *ret = calloc(1, sizeof(struct report_generator_system));
56 if (stats_update_system_stats(&ret->previous) != 0) {
57 ERR("stats_update_system_stats failed");
65 void report_generator_free_system_generator(report_generator_system_t *generator)
73 report_generator_process_t *report_generator_new_process_report_generator(int pid)
75 ON_TRUE_RETURN_VAL(pid <= 0, NULL);
77 report_generator_process_t *ret = calloc(1, sizeof(struct report_generator_process));
81 if (stats_update_process_stats(pid, &ret->previous) != 0) {
82 ERR("stats_update_process_stats failed.");
92 void report_generator_free_process_generator(report_generator_process_t *generator)
100 report_generator_app_t *report_generator_new_app_report_generator(const char *app_id)
102 ON_NULL_RETURN_VAL(app_id, NULL);
104 report_generator_app_t *ret = calloc(1, sizeof(struct report_generator_app));
106 ERR("malloc failed");
110 ret->app_id = strdup(app_id);
111 _app_report_generator_setup_process_generator(ret);
115 void report_generator_free_app_generator(report_generator_app_t *generator)
117 if (!generator) return;
118 report_generator_free_process_generator(generator->process_gen);
119 free(generator->app_id);
123 int report_generator_generate_system_cpu_usage_report(
124 report_generator_system_t *generator,
126 struct system_cpu_usage_report *report)
128 ON_NULL_RETURN_VAL(generator, -1);
129 ON_TRUE_RETURN_VAL(interval < 0, -1);
130 ON_NULL_RETURN_VAL(report, -1);
133 bool block = interval > 0;
134 struct stats_system current;
137 if (stats_update_system_stats(&generator->previous) != 0) {
138 ERR("stats_update_system_stats failed.");
144 if (stats_update_system_stats(¤t) != 0) {
145 ERR("stats_update_system_stats failed.");
149 if (stats_get_system_cpu_usage_average(&generator->previous, ¤t, &usage))
151 ERR("stats_get_system_cpu_usage_average failed");
155 report->usage = usage;
156 report->time = clock_realtime_get().tv_sec;
158 generator->previous = current;
163 int report_generator_generate_system_memory_usage_report(
164 report_generator_system_t *generator,
165 struct system_memory_usage_report *report) {
166 ON_NULL_RETURN_VAL(generator, -1);
167 ON_NULL_RETURN_VAL(report, -1);
171 if (stats_get_system_memory_usage(&usage) != 0) {
172 ERR("stats_get_system_memory_usage failed.");
176 report->time = clock_realtime_get().tv_sec;
177 report->usage = usage;
182 int report_generator_generate_process_cpu_usage_report(
183 report_generator_process_t *generator,
185 struct process_cpu_usage_report *report)
187 ON_NULL_RETURN_VAL(generator, -1);
188 ON_TRUE_RETURN_VAL(interval < 0, -1);
189 ON_NULL_RETURN_VAL(report, -1);
191 struct stats_process current = {0,};
192 bool block = interval > 0;
196 if (stats_update_process_stats(generator->pid, &generator->previous) != 0) {
197 ERR("stats_update_process_stats failed.");
203 if (stats_update_process_stats(generator->pid, ¤t) != 0) {
204 ERR("stats_update_process_stats failed.");
208 if (stats_get_process_cpu_usage_average(&generator->previous, ¤t, &usage) ) {
209 ERR("stats_update_process_stats failed.");
213 report->time = clock_realtime_get().tv_sec;
214 report->pid = generator->pid;
215 report->usage = usage;
217 generator->previous = current;
222 int report_generator_generate_process_memory_usage_report(
223 report_generator_process_t *generator,
224 struct process_memory_usage_report *report)
226 ON_NULL_RETURN_VAL(generator, -1);
227 ON_NULL_RETURN_VAL(report, -1);
231 if (stats_get_process_memory_usage(generator->pid, &usage) != 0) {
232 ERR("stats_get_process_memory_usage failed.");
236 report->time = clock_realtime_get().tv_sec;
237 report->usage = usage;
242 int _app_report_generator_setup_process_generator(report_generator_app_t *generator)
244 int pid = app_info_provider_find_main_pid(generator->app_id);
249 if (!generator->process_gen || generator->process_gen->pid != pid) {
250 if (generator->process_gen)
251 report_generator_free_process_generator(generator->process_gen);
252 generator->process_gen = report_generator_new_process_report_generator(pid);
257 int report_generator_generate_app_cpu_usage_report(
258 report_generator_app_t *generator,
260 struct app_cpu_usage_report *report)
262 ON_NULL_RETURN_VAL(generator, -1);
263 ON_TRUE_RETURN_VAL(interval < 0, -1);
264 ON_NULL_RETURN_VAL(report, -1);
266 if (_app_report_generator_setup_process_generator(generator) != 0) {
267 ERR("_app_report_generator_setup_process_generator failed.");
271 if (report_generator_generate_process_cpu_usage_report(
272 generator->process_gen, interval, &report->process_report) != 0)
274 ERR("report_generator_generate_process_cpu_usage_report failed.");
278 strncpy(report->app_id, generator->app_id, sizeof(report->app_id));
279 report->process_report.pid = generator->process_gen->pid;
284 int report_generator_generate_app_memory_usage_report(
285 report_generator_app_t *generator,
286 struct app_memory_usage_report *report)
288 ON_NULL_RETURN_VAL(generator, -1);
289 ON_NULL_RETURN_VAL(report, -1);
291 if (_app_report_generator_setup_process_generator(generator)) {
292 ERR("_app_report_generator_setup_process_generator failed.");
296 if (report_generator_generate_process_memory_usage_report(
297 generator->process_gen, &report->process_report) != 0)
299 ERR("report_generator_generate_process_memory_usage_report failed.");
303 strncpy(report->app_id, generator->app_id, sizeof(report->app_id));
304 report->process_report.pid = generator->process_gen->pid;
309 int report_generator_generate_load_average_report(struct system_load_average_report *report)
311 ON_NULL_RETURN_VAL(report, -1);
315 if (stats_get_load_averages(&a1, &a5, &a15) != 0) {
316 ERR("stats_get_load_averages failed.");
320 report->time = clock_realtime_get().tv_sec;
321 report->one_min_avg = a1;
322 report->five_min_avg = a5;
323 report->fifteen_min_avg = a15;