aboutsummaryrefslogtreecommitdiff
path: root/lib/base
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-01-02 14:31:48 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-01-02 14:31:48 +0000
commit4ca6dd275393344b9a27cfb2e5a755a4d74a414f (patch)
tree18c8ff764744d643c4835dfb14b1f3123be649a8 /lib/base
parentbfa525d0451df77a28db6ce21ec45f00b89661a8 (diff)
downloadenigma2-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.cpp12
-rw-r--r--lib/base/message.h39
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