From: Marcus Fritzsch Date: Fri, 30 Jun 2017 11:06:25 +0000 (+0200) Subject: main: better check_events implementation X-Git-Tag: 4.99.1~281 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=18cc724bb76a6b2b6e9607ce6658cb9cc8f7ec0d;p=staging%2Fwindowmanager.git main: better check_events implementation * Introduced helper struct Poller * Implements check_events() and calls custom handlers on POLLIN. * Moved status dump to genivi::controller. Signed-off-by: Marcus Fritzsch --- diff --git a/src/main.cpp b/src/main.cpp index 3c8bc0a..1359b22 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,66 +10,49 @@ struct connection { std::unique_ptr c; }; -namespace { -// _ _ _ ____ -// ___| |__ ___ ___| | __ _____ _____ _ __ | |_ ___ / /\ \ -// / __| '_ \ / _ \/ __| |/ / / _ \ \ / / _ \ '_ \| __/ __| | | | -// | (__| | | | __/ (__| < | __/\ V / __/ | | | |_\__ \ | | | -// \___|_| |_|\___|\___|_|\_\___\___| \_/ \___|_| |_|\__|___/ | | | -// |_____| \_\/_/ -int check_events(struct wl::display &d, struct connection &c, int fd) { - struct pollfd pfd[2] = {{.fd = d.get_fd(), .events = POLLIN, .revents = 0}, - {.fd = fd, .events = POLLIN, .revents = 0}}; - - d.flush(); - - if (poll(pfd, fd != -1 ? 2 : 1, -1) != -1 && errno != EINTR) { - int ret = 0; - - if ((pfd[0].revents & POLLIN) != 0) { - ret = d.dispatch(); - } - - if (ret == -1) { - return ret; - } - - if (fd != -1 && ((pfd[1].revents & POLLIN) != 0)) { - char buf[256]; +// _ _ ____ _ _ +// ___| |_ _ __ _ _ ___| |_ | _ \ ___ | | | ___ _ __ +// / __| __| '__| | | |/ __| __| | |_) / _ \| | |/ _ \ '__| +// \__ \ |_| | | |_| | (__| |_ | __/ (_) | | | __/ | +// |___/\__|_| \__,_|\___|\__| |_| \___/|_|_|\___|_| +// +struct Poller { + std::vector> handlers; + std::vector pfds; + + Poller(); + void add_fd(int fd, std::function handler); + int check_events(); +}; - // read all there is ... - while (read(pfd[1].fd, buf, sizeof(buf)) == sizeof(buf)) { - ; - } +Poller::Poller() + : handlers(), + pfds() +{ +} - // Display current status - if (!c.c->surfaces.empty()) { - puts("Surfaces:"); - for (auto const &i : c.c->surfaces) { - auto const &r = i.second->dst_rect; - auto const &s = i.second->size; - printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h, - r.x, r.y); - } - puts("\b\b "); - } +void Poller::add_fd(int fd, std::function handler) { + pfds.emplace_back(pollfd{ .fd = fd, .events = POLLIN, .revents = 0 }); + handlers.emplace_back(std::move(handler)); +} - if (!c.c->layers.empty()) { - puts("Layers:"); - for (auto const &i : c.c->layers) { - auto const &r = i.second->dst_rect; - auto const &s = i.second->size; - printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h, - r.x, r.y); +int Poller::check_events() { + int ret = 0; + if ((ret = poll(this->pfds.data(), this->pfds.size(), -1)) != -1 && errno != EINTR) { + for (unsigned i = 0; i < pfds.size(); i++) { + if (pfds[i].revents & POLLIN) { + if (handlers[i](pfds[i].fd) == -1) { + return -1; } - puts("\b\b "); + pfds[i].revents = 0; + pfds[i].events = POLLIN; } } } - - return 0; + return ret; } +namespace { // _ _ _ _ _ ____ // (_)_ __ (_) |_ | | __ _ _ _ ___ _ _| |_ / /\ \ // | | '_ \| | __| | |/ _` | | | |/ _ \| | | | __| | | | @@ -168,9 +151,22 @@ int main(int /*argc*/, char ** /*argv*/) { fatal("Could not init layout: %s", e); } - while (check_events(d, c, STDIN_FILENO) != -1) { + struct Poller p{}; + p.add_fd(STDIN_FILENO, [&c](int fd) { + int buf, ret; + while ((ret = read(fd, &buf, sizeof(buf))) == sizeof(buf)) { + ; + } + c.c->debug_dump_current_status(); + return ret == 0 ? -1 : 0; + }); + + p.add_fd(d.get_fd(), [&d](int fd) { + return d.dispatch(); + }); + + while ((d.flush(), p.check_events()) != -1) { c.c->execute_pending(); - d.flush(); } return 0; diff --git a/src/wayland.cpp b/src/wayland.cpp index 62c1afe..e7ba157 100644 --- a/src/wayland.cpp +++ b/src/wayland.cpp @@ -718,6 +718,29 @@ void controller::execute_pending() { } } +void controller::debug_dump_current_status() { + if (!this->surfaces.empty()) { + puts("Surfaces:"); + for (auto const &i : this->surfaces) { + auto const &r = i.second->dst_rect; + auto const &s = i.second->size; + printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h, + r.x, r.y); + } + puts("\b\b "); + } + + if (!this->layers.empty()) { + puts("Layers:"); + for (auto const &i : this->layers) { + auto const &r = i.second->dst_rect; + auto const &s = i.second->size; + printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h, + r.x, r.y); + } + puts("\b\b "); + } +} // // ___ ___ _ __ ___ ___ _ __ // / __|/ __| '__/ _ \/ _ \ '_ \ diff --git a/src/wayland.hpp b/src/wayland.hpp index 973e063..96b0199 100644 --- a/src/wayland.hpp +++ b/src/wayland.hpp @@ -248,6 +248,8 @@ struct controller : public wayland_proxy { size output_size; + void debug_dump_current_status(); + void add_proxy_to_id_mapping(struct ivi_controller_surface *p, uint32_t id); void remove_proxy_to_id_mapping(struct ivi_controller_surface *p); void add_proxy_to_id_mapping(struct ivi_controller_layer *p, uint32_t id);