aboutsummaryrefslogtreecommitdiff
path: root/lib/base/ebase.cpp
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2008-11-18 16:17:28 +0100
committerghost <andreas.monzner@multimedia-labs.de>2008-11-18 16:17:28 +0100
commitea644879586a9472041552d84dd7b7ebba29ec3e (patch)
tree7d4f875dbabc94887d78ff83ead0f8aebab30d06 /lib/base/ebase.cpp
parent1d042d155d0f33d2777e47da082b24b49a503491 (diff)
downloadenigma2-ea644879586a9472041552d84dd7b7ebba29ec3e.tar.gz
enigma2-ea644879586a9472041552d84dd7b7ebba29ec3e.zip
fix FATAL: ebase.cpp:129 ASSERTION notifiers.find(fd) == notifiers.end() FAILED!
Diffstat (limited to 'lib/base/ebase.cpp')
-rw-r--r--lib/base/ebase.cpp23
1 files changed, 18 insertions, 5 deletions
diff --git a/lib/base/ebase.cpp b/lib/base/ebase.cpp
index bd2ec589..f42b72b8 100644
--- a/lib/base/ebase.cpp
+++ b/lib/base/ebase.cpp
@@ -126,6 +126,18 @@ eMainloop::~eMainloop()
void eMainloop::addSocketNotifier(eSocketNotifier *sn)
{
int fd = sn->getFD();
+ std::map<int, eSocketNotifier*>::iterator it(notifiers.find(fd));
+ if (m_inActivate && m_inActivate->ref.count == 1)
+ {
+ /* when the current active SocketNotifier's refcount is one,
+ then no more external references are existing.
+ So it gets destroyed when the activate callback is finished (->AddRef() / ->Release() calls in processOneEvent).
+ But then the sn->stop() is called to late for the next Asserion.
+ Thus we call sn->stop() here (this implicitly calls eMainloop::removeSocketNotifier) and we don't get trouble
+ with the next Assertion.
+ */
+ m_inActivate->stop();
+ }
ASSERT(notifiers.find(fd) == notifiers.end());
notifiers[fd]=sn;
}
@@ -243,14 +255,15 @@ int eMainloop::processOneEvent(unsigned int twisted_timeout, PyObject **res, ePy
if (it != notifiers.end()
&& it->second->state == 1) // added and in poll
{
- eSocketNotifier *sn = it->second;
- int req = sn->getRequested();
+ m_inActivate = it->second;
+ int req = m_inActivate->getRequested();
if (pfd[i].revents & req) {
- sn->AddRef();
- sn->activate(pfd[i].revents & req);
- sn->Release();
+ m_inActivate->AddRef();
+ m_inActivate->activate(pfd[i].revents & req);
+ m_inActivate->Release();
}
pfd[i].revents &= ~req;
+ m_inActivate = 0;
}
if (pfd[i].revents & (POLLERR|POLLHUP|POLLNVAL))
eDebug("poll: unhandled POLLERR/HUP/NVAL for fd %d(%d)", pfd[i].fd, pfd[i].revents);