diff options
Diffstat (limited to 'dataservices/datatop/src/datatop.c')
-rw-r--r-- | dataservices/datatop/src/datatop.c | 283 |
1 files changed, 0 insertions, 283 deletions
diff --git a/dataservices/datatop/src/datatop.c b/dataservices/datatop/src/datatop.c deleted file mode 100644 index f079c30..0000000 --- a/dataservices/datatop/src/datatop.c +++ /dev/null @@ -1,283 +0,0 @@ -/************************************************************************ -Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -************************************************************************/ - -/** -* @file datatop.c -* @brief Executes commands for application. -* -* Contains the main() function where program executes. Calls appropriate -* methods based on user's CLI commands. Executes parsing function to -* determine necessary output and handles errors which may arise during the -* parse. Initiliazes files for data collection. Will call functions designed -* to poll and print the data in understandable format. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <time.h> -#include "datatop_interface.h" -#include "datatop_linked_list.h" -#include "datatop_opt.h" -#include "datatop_fileops.h" -#include "datatop_polling.h" -#include "datatop_gen_poll.h" - -struct dtop_linked_list *first_dpg_list; -struct cli_opts usr_cl_opts; - -/** - * @brief Prints the datapoint names and values to the terminal. - * - * @param dpg_list A pointer to the first node of a linked list which - * contains all data_point_gatherer structs to print. - */ -void dtop_print_terminal(struct dtop_linked_list *dpg_list) -{ - struct dtop_linked_list *curr_ptr = dpg_list; - struct dtop_data_point_gatherer *dpset; - - while (curr_ptr) { - dpset = (struct dtop_data_point_gatherer *) curr_ptr->data; - dtop_print_dpg(dpset); - curr_ptr = curr_ptr->next_ptr; - } -} - -/** - * @brief Polls the data periodically and prints to file specified by the user. - * - * Polls the data as often as specified by the user in their CLI arguments - * and outputs the data to a file also specified in CLI arguments. Then prints - * a snapshot of delta(dp_value) to the terminal. - * - * @param dpg_list A pointer to the first node of a linked list which contains - * all data_point_gatherer structs to poll and print. - * @param fw A pointer to the file which will be printed to. - * @return FILE_ERROR - Writing to file was unsuccessful. - * @return FILE_SUCCESS - Writing to file was successful. - */ -int dtop_poll_periodically(struct dtop_linked_list *dpg_list, FILE *fw) -{ - struct timeval tv, timeout; - fd_set rfds; - time_t curtime, endtime; - int inp, quit = 0; - struct dtop_linked_list *curr_ptr = dpg_list; - struct dtop_data_point_gatherer *dpset; - struct timeval ftime, itime, polltime; - - gettimeofday(&tv, NULL); - curtime = tv.tv_sec; - endtime = tv.tv_sec + usr_cl_opts.poll_time; - - /* print all of our datapoint names as column headers in csv format */ - if (fprintf(fw, "\"Time\",") < 0) - return FILE_ERROR; - - while (curr_ptr) { - dpset = (struct dtop_data_point_gatherer *) curr_ptr->data; - if (dtop_print_dpg_names_csv(dpset, fw) == FILE_ERROR) - return FILE_ERROR; - curr_ptr = curr_ptr->next_ptr; - } - if (fprintf(fw, "\n") < 0) - return FILE_ERROR; - - dtop_print_interactive_opts(); - gettimeofday(&itime, NULL); - /* periodically poll the datapoints and print in csv format */ - while (curtime < endtime - || usr_cl_opts.poll_time == POLL_NOT_SPECIFIED) { - FD_ZERO(&rfds); - FD_SET(0, &rfds); - timeout.tv_sec = usr_cl_opts.poll_per; - timeout.tv_usec = 0; - //ftime is right before timeout calculations for most acurate calculations - gettimeofday(&ftime, NULL); - timersub(&ftime, &itime, &polltime); - timersub(&timeout,&polltime, &timeout); - inp = select(1, &rfds, NULL, NULL, &timeout); - gettimeofday(&itime, NULL); - if (inp) { - char s[4]; - scanf("%s", s); - if (strcmp(s, "quit") == 0 - || strcmp(s, "q") == 0) { - quit = QUIT; - break; - } - if (strcmp(s, "i") == 0) { - dtop_print_snapshot_diff(first_dpg_list); - dtop_reset_dp_initial_values(first_dpg_list); - } - if (strcmp(s, "l") == 0) - dtop_print_snapshot_diff(first_dpg_list); - } - gettimeofday(&tv, NULL); - curtime = tv.tv_sec; - dtop_poll(dpg_list); - printf("Polled at %ld.%06ld\n", tv.tv_sec, tv.tv_usec); - if (dtop_print_time_at_poll(fw) == FILE_ERROR) - return FILE_ERROR; - if (dtop_write_pollingdata_csv(dpg_list, fw) == FILE_ERROR) - return FILE_ERROR; - } - - if (quit != QUIT) - dtop_print_snapshot_diff(dpg_list); - return FILE_SUCCESS; -} - -static void dtop_set_niceness(int niceness) -{ - int pid, rc; - pid = getpid(); - printf("Requesting nice %d\n", niceness); - rc = setpriority(PRIO_PROCESS, pid, niceness); - if (rc != 0) - fprintf(stderr, "Error setting priority [%d]\n", errno); - - rc = getpriority(PRIO_PROCESS, pid); - printf("Running with nice %d.\n", rc); -} - -int main(int argc, char **argv) -{ - int parse_status; - printf("DataTop - Version %s\n", VERSION); - printf("(c)2014-2015 Linux Foundation\n"); - - dtop_load_default_options(&usr_cl_opts); - - parse_status = dtop_parse_cli_opts(&usr_cl_opts, argc, argv); - switch (parse_status) { - case PARSE_SUCCESS: - dtop_set_niceness(usr_cl_opts.priority); - break; - - case PARSE_FORCE_EXIT: - exit(EXIT_SUCCESS); - break; - - case PARSE_FAILURE: - default: - printf("Failed to parse command line arguments.\n"); - exit(EXIT_FAILURE); - break; - } - - dtop_dual_line_init("/proc/net/netstat"); - dtop_dual_line_init("/proc/net/snmp"); - dtop_single_line_init("/proc/net/snmp6"); - dtop_gen_init("/proc/sys/net/"); - dtop_gen_init("/sys/module/rmnet_data/parameters/"); - dtop_gen_init("/sys/class/net/rmnet_mhi0/statistics/"); - dtop_gen_init("/sys/class/net/usb_rmnet0/statistics/"); - dtop_gen_init("/sys/class/net/rmnet_ipa0/statistics/"); - dtop_meminfo_init(); - dtop_dev_init(); - dtop_stat_init(); - dtop_cpu_stats_init(); - dtop_gen_init("/sys/kernel/debug/clk/bimc_clk/"); - dtop_gen_init("/sys/kernel/debug/clk/snoc_clk/"); - dtop_gen_init("/sys/kernel/debug/clk/pnoc_clk/"); - - if (usr_cl_opts.print_cl == OPT_CHOSE) { - dtop_poll(first_dpg_list); - dtop_print_terminal(first_dpg_list); - } - - if (usr_cl_opts.print_csv == OPT_CHOSE) { - FILE *to_file = NULL; - if ((dtop_open_writing_file(usr_cl_opts.file_name, - &to_file)) == VALID) { - printf("\nData being polled for %ld seconds.\n", - usr_cl_opts.poll_time); - if (dtop_poll_periodically(first_dpg_list, to_file) - == FILE_ERROR) { - fprintf(stderr, "err=%d: %s\n", errno, - strerror(errno)); - dtop_close_file(to_file); - deconstruct_dpgs(first_dpg_list); - dtop_rem_linked_list(first_dpg_list); - exit(EXIT_FAILURE); - } - dtop_close_file(to_file); - } else { - printf("File Can Not Be Opened\n"); - exit(EXIT_FAILURE); - } - } - - if (usr_cl_opts.snapshot_file) { - if (dtop_print_system_snapshot(usr_cl_opts.snapshot_file) - == FILE_ERROR) { - fprintf(stderr, "err=%d: %s\n", errno, - strerror(errno)); - deconstruct_dpgs(first_dpg_list); - dtop_rem_linked_list(first_dpg_list); - exit(EXIT_FAILURE); - } - } - - if (usr_cl_opts.print_cl == OPT_NOT_CHOSE && - usr_cl_opts.print_csv == OPT_NOT_CHOSE) { - if ((!usr_cl_opts.snapshot_file) - || usr_cl_opts.poll_time_selected == POLL_TIME_SELECTED) { - printf("\nData will now be polled for %ld seconds.\n", - usr_cl_opts.poll_time); - dtop_poll(first_dpg_list); - sleep(usr_cl_opts.poll_time); - dtop_poll(first_dpg_list); - dtop_print_snapshot_diff(first_dpg_list); - } - } - - deconstruct_dpgs(first_dpg_list); - dtop_rem_linked_list(first_dpg_list); - return 0; -} - -/** - * @brief Adds each dpg as a node to a linked list. - * - * Called when a dpg is initialized. - * - * @param dpg A pointer to a data_point_gatherer struct which is to be added to the linked list. - */ -void dtop_register(struct dtop_data_point_gatherer *dpg) -{ - if (dpg) - first_dpg_list = dtop_add_linked_list(dpg, first_dpg_list); -} |