add support for python threads (python threads are just running when the mainloop
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Tue, 2 Jan 2007 14:31:48 +0000 (14:31 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Tue, 2 Jan 2007 14:31:48 +0000 (14:31 +0000)
is idle)
add ePythonMessagePump class for interthread communication

lib/base/ebase.cpp
lib/base/message.h
lib/python/enigma_python.i
lib/python/python.cpp

index f40bf39..491ca09 100644 (file)
@@ -200,8 +200,16 @@ int eMainloop::processOneEvent(unsigned int user_timeout, PyObject **res, ePyObj
                        pfd[i++].events = PyInt_AsLong(val);
                }
        }
                        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)
        {
                        /* ret > 0 means that there are some active poll entries. */
        if (ret > 0)
        {
index de14db0..038fd55 100644 (file)
@@ -2,15 +2,19 @@
 #define __lib_base_message_h
 
 #include <lib/base/ebase.h>
 #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>
 
 #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.
  */
 /**
  * \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];
 class eMessagePump
 {
        int fd[2];
@@ -19,6 +23,7 @@ class eMessagePump
 public:
        eMessagePump(int mt=0);
        virtual ~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;
        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(); }
 };
        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
 
 #endif
index 2a3b89f..a1bb5b2 100644 (file)
@@ -41,6 +41,7 @@ is usually caused by not marking PSignals as immutable.
 #include <lib/base/eerror.h>
 #include <lib/base/console.h>
 #include <lib/base/nconfig.h>
 #include <lib/base/eerror.h>
 #include <lib/base/console.h>
 #include <lib/base/nconfig.h>
+#include <lib/base/message.h>
 #include <lib/driver/rc.h>
 #include <lib/service/iservice.h>
 #include <lib/service/service.h>
 #include <lib/driver/rc.h>
 #include <lib/service/iservice.h>
 #include <lib/service/service.h>
@@ -151,7 +152,8 @@ typedef long time_t;
 %immutable eDVBCI_UI::ciStateChanged;
 %immutable eDVBResourceManager::frontendUseMaskChanged;
 %immutable eAVSwitch::vcr_sb_notifier;
 %immutable eDVBCI_UI::ciStateChanged;
 %immutable eDVBResourceManager::frontendUseMaskChanged;
 %immutable eAVSwitch::vcr_sb_notifier;
-
+%immutable ePythonMessagePump::recv_msg;
+%include <lib/base/message.h>
 %include <lib/base/console.h>
 %include <lib/base/nconfig.h>
 %include <lib/driver/rc.h>
 %include <lib/base/console.h>
 %include <lib/base/nconfig.h>
 %include <lib/driver/rc.h>
index b5a7abb..5ec07df 100644 (file)
@@ -121,7 +121,8 @@ ePython::ePython()
 //     Py_OptimizeFlag = 1;
        
        Py_Initialize();
 //     Py_OptimizeFlag = 1;
        
        Py_Initialize();
-       
+       PyEval_InitThreads();
+
        init_enigma();
 }
 
        init_enigma();
 }