diff options
author | Yongqin Liu <yongqin.liu@linaro.org> | 2014-12-05 13:45:02 +0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2015-02-12 12:13:24 -0800 |
commit | a197ff12dd336a9945ad1164402980296f9c235c (patch) | |
tree | b01d81e0a3f06b3b239005697112de20f389ccda /init/init.cpp | |
parent | ed318bff41c4515ca79a11afb97507a452e9fcd3 (diff) | |
download | system_core-a197ff12dd336a9945ad1164402980296f9c235c.zip system_core-a197ff12dd336a9945ad1164402980296f9c235c.tar.gz system_core-a197ff12dd336a9945ad1164402980296f9c235c.tar.bz2 |
bootchart: fix bootchart can not be triggered problem
bootchart uses a file on the data partition to decide if it should collect
data for bootchart, but the data partition will be mounted by the mount_all
command in the "on fs" section, and it will be only added into the action
queue when command "trigger fs" is executed, but that's after the
bootchart_init action (late_init).
This change makes bootchart_init a builtin command of init,
and make it executed as the first command of "on post-fs" section
which will be triggered after the "on fs" section.
This change also refactors the bootchart code to all be in bootchart.cpp.
Change-Id: Ia74aa34ca5b785f51fcffdd383075a549b2a99d9
Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
Diffstat (limited to 'init/init.cpp')
-rw-r--r-- | init/init.cpp | 72 |
1 files changed, 12 insertions, 60 deletions
diff --git a/init/init.cpp b/init/init.cpp index 3e3be2e..8647496 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -63,9 +63,6 @@ struct selabel_handle *sehandle_prop; static int property_triggers_enabled = 0; -static int bootchart_count; -static long long bootchart_time = 0; - static char console[32]; static char bootmode[32]; static char hardware[32]; @@ -857,20 +854,6 @@ static int queue_property_triggers_action(int nargs, char **args) return 0; } -static int bootchart_init_action(int nargs, char **args) -{ - bootchart_count = bootchart_init(); - if (bootchart_count < 0) { - ERROR("bootcharting init failure\n"); - } else if (bootchart_count > 0) { - NOTICE("bootcharting started (period=%d ms)\n", bootchart_count*BOOTCHART_POLLING_MS); - } else { - NOTICE("bootcharting ignored\n"); - } - - return 0; -} - void selinux_init_all_handles(void) { sehandle = selinux_android_file_context_handle(); @@ -988,7 +971,7 @@ static void selinux_initialize(void) int main(int argc, char **argv) { - int fd_count = 0; + size_t fd_count = 0; struct pollfd ufds[4]; int property_set_fd_init = 0; int signal_fd_init = 0; @@ -1087,13 +1070,7 @@ int main(int argc, char **argv) /* run all property triggers based on current state of the properties */ queue_builtin_action(queue_property_triggers_action, "queue_property_triggers"); - if (BOOTCHART) { - queue_builtin_action(bootchart_init_action, "bootchart_init"); - } - - for(;;) { - int nr, i, timeout = -1; - + for (;;) { execute_one_command(); restart_processes(); @@ -1119,6 +1096,7 @@ int main(int argc, char **argv) keychord_fd_init = 1; } + int timeout = -1; if (process_needs_restart) { timeout = (process_needs_restart - gettime()) * 1000; if (timeout < 0) @@ -1129,48 +1107,22 @@ int main(int argc, char **argv) timeout = 0; } - if (BOOTCHART) { - if (bootchart_count > 0) { - long long current_time; - int elapsed_time, remaining_time; - - current_time = bootchart_gettime(); - elapsed_time = current_time - bootchart_time; - - if (elapsed_time >= BOOTCHART_POLLING_MS) { - /* count missed samples */ - while (elapsed_time >= BOOTCHART_POLLING_MS) { - elapsed_time -= BOOTCHART_POLLING_MS; - bootchart_count--; - } - /* count may be negative, take a sample anyway */ - bootchart_time = current_time; - if (bootchart_step() < 0 || bootchart_count <= 0) { - bootchart_finish(); - bootchart_count = 0; - } - } - if (bootchart_count > 0) { - remaining_time = BOOTCHART_POLLING_MS - elapsed_time; - if (timeout < 0 || timeout > remaining_time) { - timeout = remaining_time; - } - } - } - } + bootchart_sample(&timeout); - nr = poll(ufds, fd_count, timeout); - if (nr <= 0) + int nr = poll(ufds, fd_count, timeout); + if (nr <= 0) { continue; + } - for (i = 0; i < fd_count; i++) { + for (size_t i = 0; i < fd_count; i++) { if (ufds[i].revents & POLLIN) { - if (ufds[i].fd == get_property_set_fd()) + if (ufds[i].fd == get_property_set_fd()) { handle_property_set_fd(); - else if (ufds[i].fd == get_keychord_fd()) + } else if (ufds[i].fd == get_keychord_fd()) { handle_keychord(); - else if (ufds[i].fd == get_signal_fd()) + } else if (ufds[i].fd == get_signal_fd()) { handle_signal(); + } } } } |