From 10e7e45ae92d4fe06f70126ed256b87896dbc432 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 29 Oct 2008 19:46:57 +0000 Subject: better solution to add possibility to delete eSocketNotifiers, eConsoleAppContainers in callback funktions without crash --- .../Extensions/DVDPlayer/src/servicedvd.cpp | 4 ++-- .../Plugins/Extensions/DVDPlayer/src/servicedvd.h | 2 +- .../Extensions/SocketMMI/src/socket_mmi.cpp | 13 ++++------- .../Plugins/Extensions/SocketMMI/src/socket_mmi.h | 2 +- lib/python/connections.cpp | 22 +++++++++++------- lib/python/connections.h | 27 ++++++---------------- 6 files changed, 29 insertions(+), 41 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp index da7bc5f2..1add04ab 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp @@ -91,9 +91,9 @@ eServiceDVD::eServiceDVD(const char *filename): m_subtitle_widget(0), m_state(stIdle), m_current_trick(0), - m_sn(eApp, ddvd_get_messagepipe_fd(m_ddvdconfig), eSocketNotifier::Read|eSocketNotifier::Priority|eSocketNotifier::Error|eSocketNotifier::Hungup), m_pump(eApp, 1) { + m_sn = eSocketNotifier::create(eApp, ddvd_get_messagepipe_fd(m_ddvdconfig), eSocketNotifier::Read|eSocketNotifier::Priority|eSocketNotifier::Error|eSocketNotifier::Hungup); std::string aspect; eDebug("SERVICEDVD construct!"); // create handle @@ -111,7 +111,7 @@ eServiceDVD::eServiceDVD(const char *filename): ddvd_set_video(m_ddvdconfig, DDVD_16_9, DDVD_PAL); ddvd_set_lfb(m_ddvdconfig, (unsigned char *)m_pixmap->surface->data, 720, 576, 4, 720*4); - CONNECT(m_sn.activated, eServiceDVD::gotMessage); + CONNECT(m_sn->activated, eServiceDVD::gotMessage); CONNECT(m_pump.recv_msg, eServiceDVD::gotThreadMessage); strcpy(m_ddvd_titlestring,""); m_cue_pts = 0; diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h index bdec4836..12e21d2f 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h @@ -118,7 +118,7 @@ private: char m_ddvd_titlestring[96]; - eSocketNotifier m_sn; + ePtr m_sn; eFixedMessagePump m_pump; pts_t m_cue_pts; diff --git a/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp b/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp index 36ce9f40..673b525c 100644 --- a/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp +++ b/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp @@ -129,7 +129,7 @@ int eSocketMMIHandler::send_to_mmisock( void* buf, size_t len) } eSocketMMIHandler::eSocketMMIHandler() - :buffer(512), connfd(-1), connsn(0), sockname("/tmp/mmi.socket"), name(0) + :buffer(512), connfd(-1), sockname("/tmp/mmi.socket"), name(0) { memset(&servaddr, 0, sizeof(struct sockaddr_un)); servaddr.sun_family = AF_UNIX; @@ -154,7 +154,7 @@ eSocketMMIHandler::eSocketMMIHandler() else if (listen(listenfd, 0) == -1) eDebug("[eSocketMMIHandler] listen (%m)"); else { - listensn = new eSocketNotifier( eApp, listenfd, POLLIN ); + listensn = eSocketNotifier::create( eApp, listenfd, POLLIN ); listensn->start(); CONNECT( listensn->activated, eSocketMMIHandler::listenDataAvail ); eDebug("[eSocketMMIHandler] created successfully"); @@ -186,7 +186,7 @@ void eSocketMMIHandler::listenDataAvail(int what) else if (fcntl(connfd, F_SETFL, val | O_NONBLOCK) == -1) eDebug("[eSocketMMIHandler] F_SETFL (%m)"); else { - connsn = new eSocketNotifier( eApp, connfd, POLLIN|POLLHUP|POLLERR ); + connsn = eSocketNotifier::create( eApp, connfd, POLLIN|POLLHUP|POLLERR ); CONNECT( connsn->activated, eSocketMMIHandler::connDataAvail ); return; } @@ -294,11 +294,7 @@ void eSocketMMIHandler::closeConn() close(connfd); connfd=-1; } - if ( connsn ) - { - delete connsn; - connsn=0; - } + connsn=0; if ( name ) { delete [] name; @@ -309,7 +305,6 @@ void eSocketMMIHandler::closeConn() eSocketMMIHandler::~eSocketMMIHandler() { closeConn(); - delete listensn; unlink(sockname); } diff --git a/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.h b/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.h index ebba9a62..063e1d54 100644 --- a/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.h +++ b/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.h @@ -16,7 +16,7 @@ class eSocketMMIHandler: public Object eIOBuffer buffer; int listenfd, connfd, clilen; struct sockaddr_un servaddr; - eSocketNotifier *listensn, *connsn; + ePtr listensn, connsn; void listenDataAvail(int what); void connDataAvail(int what); void closeConn(); diff --git a/lib/python/connections.cpp b/lib/python/connections.cpp index b54c07b1..c0d38f89 100644 --- a/lib/python/connections.cpp +++ b/lib/python/connections.cpp @@ -1,14 +1,11 @@ #include PSignal::PSignal() - :m_destroyed(0) { } PSignal::~PSignal() { - if (m_destroyed) - *m_destroyed = true; Py_XDECREF(m_list); } @@ -23,12 +20,21 @@ void PSignal::callPython(ePyObject tuple) } } -PyObject *PSignal::get(bool steal) +PyObject *PSignal::get() { - if (!steal) { - if (!m_list) - m_list = PyList_New(0); - Py_INCREF(m_list); + if (!m_list) + m_list = PyList_New(0); + Py_INCREF(m_list); + return m_list; +} + +PyObject *PSignal::getSteal(bool clear) +{ + if (clear) + { + ePyObject ret = m_list; + m_list = (PyObject*)0; + return ret; } return m_list; } diff --git a/lib/python/connections.h b/lib/python/connections.h index ab123137..ad76198a 100644 --- a/lib/python/connections.h +++ b/lib/python/connections.h @@ -14,12 +14,14 @@ class PSignal { protected: ePyObject m_list; - bool *m_destroyed; public: PSignal(); ~PSignal(); void callPython(SWIG_PYOBJECT(ePyObject) tuple); - PyObject *get(bool steal=false); +#ifndef SWIG + PyObject *getSteal(bool clear=false); +#endif + PyObject *get(); }; inline PyObject *PyFrom(int v) @@ -38,18 +40,13 @@ class PSignal0: public PSignal, public Signal0 public: R operator()() { - bool destroyed=false; - m_destroyed = &destroyed; if (m_list) { PyObject *pArgs = PyTuple_New(0); callPython(pArgs); Org_Py_DECREF(pArgs); } - if (!destroyed) { - m_destroyed = 0; - return Signal0::operator()(); - } + return Signal0::operator()(); } }; @@ -59,8 +56,6 @@ class PSignal1: public PSignal, public Signal1 public: R operator()(V0 a0) { - bool destroyed=false; - m_destroyed = &destroyed; if (m_list) { PyObject *pArgs = PyTuple_New(1); @@ -68,10 +63,7 @@ public: callPython(pArgs); Org_Py_DECREF(pArgs); } - if (!destroyed) { - m_destroyed = 0; - return Signal1::operator()(a0); - } + return Signal1::operator()(a0); } }; @@ -81,8 +73,6 @@ class PSignal2: public PSignal, public Signal2 public: R operator()(V0 a0, V1 a1) { - bool destroyed=false; - m_destroyed = &destroyed; if (m_list) { PyObject *pArgs = PyTuple_New(2); @@ -91,10 +81,7 @@ public: callPython(pArgs); Org_Py_DECREF(pArgs); } - if (!destroyed) { - m_destroyed = 0; - return Signal2::operator()(a0, a1); - } + return Signal2::operator()(a0, a1); } }; -- cgit v1.2.3