Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2899c94b authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Switch init to epoll."

parents df5d4482 929f4070
Loading
Loading
Loading
Loading
+25 −35
Original line number Diff line number Diff line
@@ -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>
@@ -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.
@@ -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();
@@ -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;
@@ -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)();
        }
    }

+2 −0
Original line number Diff line number Diff line
@@ -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 */
+25 −34
Original line number Diff line number Diff line
@@ -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;
@@ -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);
}
+2 −4
Original line number Diff line number Diff line
@@ -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
+2 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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