X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/923c229f865f1d2052d99e10cdc8d4f3cce83f26..9b02ceae89a3b478549f6dbd89ba7aa174cb7b12:/lib/base/ebase.cpp diff --git a/lib/base/ebase.cpp b/lib/base/ebase.cpp index 8563a593..addd1b88 100644 --- a/lib/base/ebase.cpp +++ b/lib/base/ebase.cpp @@ -165,7 +165,6 @@ int eMainloop::processOneEvent(unsigned int user_timeout, PyObject **res, PyObje int ret = 0; - if (poll_timeout) { std::multimap::iterator it; @@ -312,10 +311,31 @@ int eMainloop::iterate(unsigned int user_timeout, PyObject **res, PyObject *dict { int ret = 0; + timeval user_timer; + gettimeofday(&user_timer, 0); + user_timer += user_timeout; + + /* TODO: this code just became ugly. fix that. */ do - { + { + if (m_interrupt_requested) + { + m_interrupt_requested = 0; + return 0; + } if (app_quit_now) return -1; - ret = processOneEvent(user_timeout, res, dict); + timeval now, timeout; + gettimeofday(&now, 0); + timeout = user_timer - now; + + if (user_timeout && (user_timer <= now)) + return 0; + + int to = 0; + if (user_timeout) + to = timeout.tv_sec * 1000 + timeout.tv_usec / 1000; + + ret = processOneEvent(to, res, dict); if (res && *res) return ret; } while (ret == 0); @@ -333,8 +353,15 @@ int eMainloop::runLoop() PyObject *eMainloop::poll(PyObject *timeout, PyObject *dict) { PyObject *res = 0; - int user_timeout = (timeout == Py_None) ? 0 : PyInt_AsLong(timeout); + if (app_quit_now) + { + Py_INCREF(Py_None); + return Py_None; + } + + int user_timeout = (timeout == Py_None) ? 0 : PyInt_AsLong(timeout); + iterate(user_timeout, &res, dict); if (!res) /* return empty list on timeout */ @@ -343,6 +370,11 @@ PyObject *eMainloop::poll(PyObject *timeout, PyObject *dict) return res; } +void eMainloop::interruptPoll() +{ + m_interrupt_requested = 1; +} + void eMainloop::quit(int ret) { retval = ret;