summaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-06-30 13:06:25 +0200
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>2017-08-08 17:24:00 +0200
commit18cc724bb76a6b2b6e9607ce6658cb9cc8f7ec0d (patch)
treede446173c94cc9e98106146c52dcb900cf404c51 /src/main.cpp
parent22cf0bf96f4a94f5fbfec6f5dfc3adeb5b66e7ac (diff)
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 <marcus_fritzsch@mentor.com>
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp102
1 files changed, 49 insertions, 53 deletions
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<genivi::controller> 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<std::function<int(int)>> handlers;
+ std::vector<struct pollfd> pfds;
+
+ Poller();
+ void add_fd(int fd, std::function<int(int)> 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<int(int)> 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;