Loading init/init.cpp +25 −35 Original line number Diff line number Diff line Loading @@ -25,8 +25,8 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/epoll.h> #include <sys/mount.h> #include <sys/poll.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/types.h> Loading Loading @@ -82,6 +82,17 @@ static const char *ENV[32]; bool waiting_for_exec = false; static int epoll_fd = -1; void register_epoll_handler(int fd, void (*fn)()) { epoll_event ev; ev.events = EPOLLIN; ev.data.ptr = reinterpret_cast<void*>(fn); if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) { ERROR("epoll_ctl failed: %s\n", strerror(errno)); } } void service::NotifyStateChange(const char* new_state) { if (!properties_initialized()) { // If properties aren't available yet, we can't set them. Loading Loading @@ -1037,7 +1048,13 @@ int main(int argc, char** argv) { restorecon("/dev/__properties__"); restorecon_recursive("/sys"); signal_init(); epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (epoll_fd == -1) { ERROR("epoll_create1 failed: %s\n", strerror(errno)); exit(1); } signal_handler_init(); property_load_boot_defaults(); start_property_service(); Loading Loading @@ -1071,27 +1088,12 @@ 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"); size_t fd_count = 0; struct pollfd ufds[3]; ufds[fd_count++] = { .fd = get_signal_fd(), .events = POLLIN, .revents = 0 }; 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; while (true) { if (!waiting_for_exec) { execute_one_command(); restart_processes(); } if (!keychord_fd_init && get_keychord_fd() > 0) { ufds[fd_count].fd = get_keychord_fd(); ufds[fd_count].events = POLLIN; ufds[fd_count].revents = 0; fd_count++; keychord_fd_init = true; } int timeout = -1; if (process_needs_restart) { timeout = (process_needs_restart - gettime()) * 1000; Loading @@ -1105,24 +1107,12 @@ int main(int argc, char** argv) { bootchart_sample(&timeout); int nr = TEMP_FAILURE_RETRY(poll(ufds, fd_count, timeout)); if (nr <= 0) { epoll_event ev; int nr = TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, &ev, 1, timeout)); if (nr == -1) { ERROR("poll failed: %s\n", strerror(errno)); } continue; } for (size_t i = 0; i < fd_count; i++) { if (ufds[i].revents & POLLIN) { if (ufds[i].fd == get_property_set_fd()) { handle_property_set_fd(); } else if (ufds[i].fd == get_keychord_fd()) { handle_keychord(); } else if (ufds[i].fd == get_signal_fd()) { handle_signal(); } } ERROR("epoll_wait failed: %s\n", strerror(errno)); } else if (nr == 1) { ((void (*)()) ev.data.ptr)(); } } Loading init/init.h +2 −0 Original line number Diff line number Diff line Loading @@ -155,4 +155,6 @@ int selinux_reload_policy(void); void zap_stdio(void); void register_epoll_handler(int fd, void (*fn)()); #endif /* _INIT_INIT_H */ init/keychords.cpp +25 −34 Original line number Diff line number Diff line Loading @@ -62,37 +62,7 @@ void add_service_keycodes(struct service *svc) } } void keychord_init() { int fd, ret; service_for_each(add_service_keycodes); /* nothing to do if no services require keychords */ if (!keychords) return; fd = open("/dev/keychord", O_RDWR | O_CLOEXEC); if (fd < 0) { ERROR("could not open /dev/keychord\n"); return; } ret = write(fd, keychords, keychords_length); if (ret != keychords_length) { ERROR("could not configure /dev/keychord %d: %s\n", ret, strerror(errno)); close(fd); fd = -1; } free(keychords); keychords = 0; keychord_fd = fd; } void handle_keychord() { static void handle_keychord() { struct service *svc; char adb_enabled[PROP_VALUE_MAX]; int ret; Loading @@ -117,7 +87,28 @@ void handle_keychord() } } int get_keychord_fd() { return keychord_fd; void keychord_init() { service_for_each(add_service_keycodes); // Nothing to do if no services require keychords. if (!keychords) { return; } keychord_fd = TEMP_FAILURE_RETRY(open("/dev/keychord", O_RDWR | O_CLOEXEC)); if (keychord_fd == -1) { ERROR("could not open /dev/keychord: %s\n", strerror(errno)); return; } int ret = write(keychord_fd, keychords, keychords_length); if (ret != keychords_length) { ERROR("could not configure /dev/keychord %d: %s\n", ret, strerror(errno)); close(keychord_fd); } free(keychords); keychords = nullptr; register_epoll_handler(keychord_fd, handle_keychord); } init/keychords.h +2 −4 Original line number Diff line number Diff line Loading @@ -19,9 +19,7 @@ struct service; void add_service_keycodes(struct service *svc); void keychord_init(void); void handle_keychord(void); int get_keychord_fd(void); void add_service_keycodes(service*); void keychord_init(); #endif init/property_service.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -246,7 +246,7 @@ int property_set(const char* name, const char* value) { return rc; } void handle_property_set_fd() static void handle_property_set_fd() { prop_msg msg; int s; Loading Loading @@ -527,8 +527,6 @@ void start_property_service() { } listen(property_set_fd, 8); } int get_property_set_fd() { return property_set_fd; register_epoll_handler(property_set_fd, handle_property_set_fd); } Loading
init/init.cpp +25 −35 Original line number Diff line number Diff line Loading @@ -25,8 +25,8 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/epoll.h> #include <sys/mount.h> #include <sys/poll.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/types.h> Loading Loading @@ -82,6 +82,17 @@ static const char *ENV[32]; bool waiting_for_exec = false; static int epoll_fd = -1; void register_epoll_handler(int fd, void (*fn)()) { epoll_event ev; ev.events = EPOLLIN; ev.data.ptr = reinterpret_cast<void*>(fn); if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) { ERROR("epoll_ctl failed: %s\n", strerror(errno)); } } void service::NotifyStateChange(const char* new_state) { if (!properties_initialized()) { // If properties aren't available yet, we can't set them. Loading Loading @@ -1037,7 +1048,13 @@ int main(int argc, char** argv) { restorecon("/dev/__properties__"); restorecon_recursive("/sys"); signal_init(); epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (epoll_fd == -1) { ERROR("epoll_create1 failed: %s\n", strerror(errno)); exit(1); } signal_handler_init(); property_load_boot_defaults(); start_property_service(); Loading Loading @@ -1071,27 +1088,12 @@ 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"); size_t fd_count = 0; struct pollfd ufds[3]; ufds[fd_count++] = { .fd = get_signal_fd(), .events = POLLIN, .revents = 0 }; 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; while (true) { if (!waiting_for_exec) { execute_one_command(); restart_processes(); } if (!keychord_fd_init && get_keychord_fd() > 0) { ufds[fd_count].fd = get_keychord_fd(); ufds[fd_count].events = POLLIN; ufds[fd_count].revents = 0; fd_count++; keychord_fd_init = true; } int timeout = -1; if (process_needs_restart) { timeout = (process_needs_restart - gettime()) * 1000; Loading @@ -1105,24 +1107,12 @@ int main(int argc, char** argv) { bootchart_sample(&timeout); int nr = TEMP_FAILURE_RETRY(poll(ufds, fd_count, timeout)); if (nr <= 0) { epoll_event ev; int nr = TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, &ev, 1, timeout)); if (nr == -1) { ERROR("poll failed: %s\n", strerror(errno)); } continue; } for (size_t i = 0; i < fd_count; i++) { if (ufds[i].revents & POLLIN) { if (ufds[i].fd == get_property_set_fd()) { handle_property_set_fd(); } else if (ufds[i].fd == get_keychord_fd()) { handle_keychord(); } else if (ufds[i].fd == get_signal_fd()) { handle_signal(); } } ERROR("epoll_wait failed: %s\n", strerror(errno)); } else if (nr == 1) { ((void (*)()) ev.data.ptr)(); } } Loading
init/init.h +2 −0 Original line number Diff line number Diff line Loading @@ -155,4 +155,6 @@ int selinux_reload_policy(void); void zap_stdio(void); void register_epoll_handler(int fd, void (*fn)()); #endif /* _INIT_INIT_H */
init/keychords.cpp +25 −34 Original line number Diff line number Diff line Loading @@ -62,37 +62,7 @@ void add_service_keycodes(struct service *svc) } } void keychord_init() { int fd, ret; service_for_each(add_service_keycodes); /* nothing to do if no services require keychords */ if (!keychords) return; fd = open("/dev/keychord", O_RDWR | O_CLOEXEC); if (fd < 0) { ERROR("could not open /dev/keychord\n"); return; } ret = write(fd, keychords, keychords_length); if (ret != keychords_length) { ERROR("could not configure /dev/keychord %d: %s\n", ret, strerror(errno)); close(fd); fd = -1; } free(keychords); keychords = 0; keychord_fd = fd; } void handle_keychord() { static void handle_keychord() { struct service *svc; char adb_enabled[PROP_VALUE_MAX]; int ret; Loading @@ -117,7 +87,28 @@ void handle_keychord() } } int get_keychord_fd() { return keychord_fd; void keychord_init() { service_for_each(add_service_keycodes); // Nothing to do if no services require keychords. if (!keychords) { return; } keychord_fd = TEMP_FAILURE_RETRY(open("/dev/keychord", O_RDWR | O_CLOEXEC)); if (keychord_fd == -1) { ERROR("could not open /dev/keychord: %s\n", strerror(errno)); return; } int ret = write(keychord_fd, keychords, keychords_length); if (ret != keychords_length) { ERROR("could not configure /dev/keychord %d: %s\n", ret, strerror(errno)); close(keychord_fd); } free(keychords); keychords = nullptr; register_epoll_handler(keychord_fd, handle_keychord); }
init/keychords.h +2 −4 Original line number Diff line number Diff line Loading @@ -19,9 +19,7 @@ struct service; void add_service_keycodes(struct service *svc); void keychord_init(void); void handle_keychord(void); int get_keychord_fd(void); void add_service_keycodes(service*); void keychord_init(); #endif
init/property_service.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -246,7 +246,7 @@ int property_set(const char* name, const char* value) { return rc; } void handle_property_set_fd() static void handle_property_set_fd() { prop_msg msg; int s; Loading Loading @@ -527,8 +527,6 @@ void start_property_service() { } listen(property_set_fd, 8); } int get_property_set_fd() { return property_set_fd; register_epoll_handler(property_set_fd, handle_property_set_fd); }