summaryrefslogtreecommitdiffstats
path: root/init/init.cpp
diff options
context:
space:
mode:
authorYongqin Liu <yongqin.liu@linaro.org>2014-12-05 13:45:02 +0800
committerElliott Hughes <enh@google.com>2015-02-12 12:13:24 -0800
commita197ff12dd336a9945ad1164402980296f9c235c (patch)
treeb01d81e0a3f06b3b239005697112de20f389ccda /init/init.cpp
parented318bff41c4515ca79a11afb97507a452e9fcd3 (diff)
downloadsystem_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.cpp72
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();
+ }
}
}
}