diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2007-01-02 14:31:48 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2007-01-02 14:31:48 +0000 |
| commit | 4ca6dd275393344b9a27cfb2e5a755a4d74a414f (patch) | |
| tree | 18c8ff764744d643c4835dfb14b1f3123be649a8 /lib/base | |
| parent | bfa525d0451df77a28db6ce21ec45f00b89661a8 (diff) | |
| download | enigma2-4ca6dd275393344b9a27cfb2e5a755a4d74a414f.tar.gz enigma2-4ca6dd275393344b9a27cfb2e5a755a4d74a414f.zip | |
add support for python threads (python threads are just running when the mainloop
is idle)
add ePythonMessagePump class for interthread communication
Diffstat (limited to 'lib/base')
| -rw-r--r-- | lib/base/ebase.cpp | 12 | ||||
| -rw-r--r-- | lib/base/message.h | 39 |
2 files changed, 49 insertions, 2 deletions
diff --git a/lib/base/ebase.cpp b/lib/base/ebase.cpp index f40bf39e..491ca093 100644 --- a/lib/base/ebase.cpp +++ b/lib/base/ebase.cpp @@ -200,8 +200,16 @@ int eMainloop::processOneEvent(unsigned int user_timeout, PyObject **res, ePyObj pfd[i++].events = PyInt_AsLong(val); } } - - ret = ::poll(pfd, fdcount, poll_timeout); + + if (this == eApp) + { + Py_BEGIN_ALLOW_THREADS + ret = ::poll(pfd, fdcount, poll_timeout); + Py_END_ALLOW_THREADS + } + else + ret = ::poll(pfd, fdcount, poll_timeout); + /* ret > 0 means that there are some active poll entries. */ if (ret > 0) { diff --git a/lib/base/message.h b/lib/base/message.h index de14db0f..038fd55d 100644 --- a/lib/base/message.h +++ b/lib/base/message.h @@ -2,15 +2,19 @@ #define __lib_base_message_h #include <lib/base/ebase.h> +#include <lib/python/connections.h> +#include <lib/python/swig.h> #include <unistd.h> #include <lib/base/elock.h> + /** * \brief A generic messagepump. * * You can send and receive messages with this class. Internally a fifo is used, * so you can use them together with a \c eMainloop. */ +#ifndef SWIG class eMessagePump { int fd[2]; @@ -19,6 +23,7 @@ class eMessagePump public: eMessagePump(int mt=0); virtual ~eMessagePump(); +protected: int send(const void *data, int len); int recv(void *data, int len); // blockierend int getInputFD() const; @@ -61,5 +66,39 @@ public: void start() { if (sn) sn->start(); } void stop() { if (sn) sn->stop(); } }; +#endif + +class ePythonMessagePump: public eMessagePump, public Object +{ + eSocketNotifier *sn; + void do_recv(int) + { + int msg; + recv(&msg, sizeof(msg)); + /*emit*/ recv_msg(msg); + } +public: + PSignal1<void,int> recv_msg; + void send(int msg) + { + eMessagePump::send(&msg, sizeof(msg)); + } + ePythonMessagePump() + :eMessagePump(1) + { + eDebug("add python messagepump %p", this); + sn=new eSocketNotifier(eApp, getOutputFD(), eSocketNotifier::Read); + CONNECT(sn->activated, ePythonMessagePump::do_recv); + sn->start(); + } + ~ePythonMessagePump() + { + eDebug("remove python messagepump %p", this); + delete sn; + sn=0; + } + void start() { if (sn) sn->start(); } + void stop() { if (sn) sn->stop(); } +}; #endif |
