Loading init/init.cpp +20 −36 Original line number Diff line number Diff line Loading @@ -603,14 +603,16 @@ void execute_one_command() { } } static int wait_for_coldboot_done_action(int nargs, char **args) { int ret; INFO("wait for %s\n", COLDBOOT_DONE); ret = wait_for_file(COLDBOOT_DONE, COMMAND_RETRY_TIMEOUT); if (ret) static int wait_for_coldboot_done_action(int nargs, char **args) { Timer t; NOTICE("Waiting for %s...\n", COLDBOOT_DONE); if (wait_for_file(COLDBOOT_DONE, COMMAND_RETRY_TIMEOUT)) { ERROR("Timed out waiting for %s\n", COLDBOOT_DONE); return ret; } NOTICE("Waiting for %s took %.2fs.\n", COLDBOOT_DONE, t.duration()); return 0; } /* Loading Loading @@ -832,22 +834,6 @@ static void process_kernel_cmdline(void) import_kernel_cmdline(1, import_kernel_nv); } static int property_service_init_action(int nargs, char **args) { /* read any property files on system or data and * fire up the property service. This must happen * after the ro.foo properties are set above so * that /data/local.prop cannot interfere with them. */ start_property_service(); if (get_property_set_fd() < 0) { ERROR("start_property_service() failed\n"); exit(1); } return 0; } static int queue_property_triggers_action(int nargs, char **args) { queue_all_property_triggers(); Loading @@ -856,7 +842,7 @@ static int queue_property_triggers_action(int nargs, char **args) return 0; } void selinux_init_all_handles(void) static void selinux_init_all_handles(void) { sehandle = selinux_android_file_context_handle(); selinux_android_set_sehandle(sehandle); Loading Loading @@ -1054,12 +1040,15 @@ int main(int argc, char** argv) { signal_init(); property_load_boot_defaults(); start_property_service(); init_parse_config_file("/init.rc"); action_for_each_trigger("early-init", action_add_queue_tail); // Queue an action that waits for coldboot done so we know ueventd has set up all of /dev... queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done"); // ... so that we can start queuing up actions that require stuff from /dev. queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng"); queue_builtin_action(keychord_init_action, "keychord_init"); queue_builtin_action(console_init_action, "console_init"); Loading @@ -1070,7 +1059,6 @@ int main(int argc, char** argv) { // Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random // wasn't ready immediately after wait_for_coldboot_done queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng"); queue_builtin_action(property_service_init_action, "property_service_init"); // Don't mount filesystems or start core system services in charger mode. char bootmode[PROP_VALUE_MAX]; Loading @@ -1083,26 +1071,19 @@ 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"); // TODO: why do we only initialize ufds after execute_one_command and restart_processes? size_t fd_count = 0; struct pollfd ufds[3]; ufds[fd_count++] = { .fd = get_signal_fd(), .events = POLLIN, .revents = 0 }; bool property_set_fd_init = false; ufds[fd_count++] = { .fd = get_property_set_fd(), .events = POLLIN, .revents = 0 }; // TODO: can we work out when /dev/keychord is first accessible and open this fd then? bool keychord_fd_init = false; for (;;) { while (true) { if (!waiting_for_exec) { execute_one_command(); restart_processes(); } if (!property_set_fd_init && get_property_set_fd() > 0) { ufds[fd_count].fd = get_property_set_fd(); ufds[fd_count].events = POLLIN; ufds[fd_count].revents = 0; fd_count++; property_set_fd_init = true; } if (!keychord_fd_init && get_keychord_fd() > 0) { ufds[fd_count].fd = get_keychord_fd(); ufds[fd_count].events = POLLIN; Loading @@ -1124,8 +1105,11 @@ int main(int argc, char** argv) { bootchart_sample(&timeout); int nr = poll(ufds, fd_count, timeout); int nr = TEMP_FAILURE_RETRY(poll(ufds, fd_count, timeout)); if (nr <= 0) { if (nr == -1) { ERROR("poll failed: %s\n", strerror(errno)); } continue; } Loading init/property_service.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -519,14 +519,14 @@ void load_all_props() { } void start_property_service() { int fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0, NULL); if (fd == -1) return; fcntl(fd, F_SETFD, FD_CLOEXEC); fcntl(fd, F_SETFL, O_NONBLOCK); property_set_fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0666, 0, 0, NULL); if (property_set_fd == -1) { ERROR("start_property_service socket creation failed: %s\n", strerror(errno)); exit(1); } listen(fd, 8); property_set_fd = fd; listen(property_set_fd, 8); } int get_property_set_fd() { Loading Loading
init/init.cpp +20 −36 Original line number Diff line number Diff line Loading @@ -603,14 +603,16 @@ void execute_one_command() { } } static int wait_for_coldboot_done_action(int nargs, char **args) { int ret; INFO("wait for %s\n", COLDBOOT_DONE); ret = wait_for_file(COLDBOOT_DONE, COMMAND_RETRY_TIMEOUT); if (ret) static int wait_for_coldboot_done_action(int nargs, char **args) { Timer t; NOTICE("Waiting for %s...\n", COLDBOOT_DONE); if (wait_for_file(COLDBOOT_DONE, COMMAND_RETRY_TIMEOUT)) { ERROR("Timed out waiting for %s\n", COLDBOOT_DONE); return ret; } NOTICE("Waiting for %s took %.2fs.\n", COLDBOOT_DONE, t.duration()); return 0; } /* Loading Loading @@ -832,22 +834,6 @@ static void process_kernel_cmdline(void) import_kernel_cmdline(1, import_kernel_nv); } static int property_service_init_action(int nargs, char **args) { /* read any property files on system or data and * fire up the property service. This must happen * after the ro.foo properties are set above so * that /data/local.prop cannot interfere with them. */ start_property_service(); if (get_property_set_fd() < 0) { ERROR("start_property_service() failed\n"); exit(1); } return 0; } static int queue_property_triggers_action(int nargs, char **args) { queue_all_property_triggers(); Loading @@ -856,7 +842,7 @@ static int queue_property_triggers_action(int nargs, char **args) return 0; } void selinux_init_all_handles(void) static void selinux_init_all_handles(void) { sehandle = selinux_android_file_context_handle(); selinux_android_set_sehandle(sehandle); Loading Loading @@ -1054,12 +1040,15 @@ int main(int argc, char** argv) { signal_init(); property_load_boot_defaults(); start_property_service(); init_parse_config_file("/init.rc"); action_for_each_trigger("early-init", action_add_queue_tail); // Queue an action that waits for coldboot done so we know ueventd has set up all of /dev... queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done"); // ... so that we can start queuing up actions that require stuff from /dev. queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng"); queue_builtin_action(keychord_init_action, "keychord_init"); queue_builtin_action(console_init_action, "console_init"); Loading @@ -1070,7 +1059,6 @@ int main(int argc, char** argv) { // Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random // wasn't ready immediately after wait_for_coldboot_done queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng"); queue_builtin_action(property_service_init_action, "property_service_init"); // Don't mount filesystems or start core system services in charger mode. char bootmode[PROP_VALUE_MAX]; Loading @@ -1083,26 +1071,19 @@ 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"); // TODO: why do we only initialize ufds after execute_one_command and restart_processes? size_t fd_count = 0; struct pollfd ufds[3]; ufds[fd_count++] = { .fd = get_signal_fd(), .events = POLLIN, .revents = 0 }; bool property_set_fd_init = false; ufds[fd_count++] = { .fd = get_property_set_fd(), .events = POLLIN, .revents = 0 }; // TODO: can we work out when /dev/keychord is first accessible and open this fd then? bool keychord_fd_init = false; for (;;) { while (true) { if (!waiting_for_exec) { execute_one_command(); restart_processes(); } if (!property_set_fd_init && get_property_set_fd() > 0) { ufds[fd_count].fd = get_property_set_fd(); ufds[fd_count].events = POLLIN; ufds[fd_count].revents = 0; fd_count++; property_set_fd_init = true; } if (!keychord_fd_init && get_keychord_fd() > 0) { ufds[fd_count].fd = get_keychord_fd(); ufds[fd_count].events = POLLIN; Loading @@ -1124,8 +1105,11 @@ int main(int argc, char** argv) { bootchart_sample(&timeout); int nr = poll(ufds, fd_count, timeout); int nr = TEMP_FAILURE_RETRY(poll(ufds, fd_count, timeout)); if (nr <= 0) { if (nr == -1) { ERROR("poll failed: %s\n", strerror(errno)); } continue; } Loading
init/property_service.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -519,14 +519,14 @@ void load_all_props() { } void start_property_service() { int fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0, NULL); if (fd == -1) return; fcntl(fd, F_SETFD, FD_CLOEXEC); fcntl(fd, F_SETFL, O_NONBLOCK); property_set_fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0666, 0, 0, NULL); if (property_set_fd == -1) { ERROR("start_property_service socket creation failed: %s\n", strerror(errno)); exit(1); } listen(fd, 8); property_set_fd = fd; listen(property_set_fd, 8); } int get_property_set_fd() { Loading