From 4ca6dd275393344b9a27cfb2e5a755a4d74a414f Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Tue, 2 Jan 2007 14:31:48 +0000 Subject: [PATCH] add support for python threads (python threads are just running when the mainloop is idle) add ePythonMessagePump class for interthread communication --- lib/base/ebase.cpp | 12 ++++++++++-- lib/base/message.h | 39 ++++++++++++++++++++++++++++++++++++++ lib/python/enigma_python.i | 4 +++- lib/python/python.cpp | 3 ++- 4 files changed, 54 insertions(+), 4 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 +#include +#include #include #include + /** * \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 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 diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 2a3b89fd..a1bb5b28 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -41,6 +41,7 @@ is usually caused by not marking PSignals as immutable. #include #include #include +#include #include #include #include @@ -151,7 +152,8 @@ typedef long time_t; %immutable eDVBCI_UI::ciStateChanged; %immutable eDVBResourceManager::frontendUseMaskChanged; %immutable eAVSwitch::vcr_sb_notifier; - +%immutable ePythonMessagePump::recv_msg; +%include %include %include %include diff --git a/lib/python/python.cpp b/lib/python/python.cpp index b5a7abbf..5ec07dff 100644 --- a/lib/python/python.cpp +++ b/lib/python/python.cpp @@ -121,7 +121,8 @@ ePython::ePython() // Py_OptimizeFlag = 1; Py_Initialize(); - + PyEval_InitThreads(); + init_enigma(); } -- 2.30.2