fix compiler warnings
[enigma2.git] / lib / base / ebase.cpp
index bd2ec589227946199b60071faf4ab4617dc850ba..700cce368d2c5224cd4ae679e7d0632c7f5bc8e2 100644 (file)
@@ -26,8 +26,11 @@ void eSocketNotifier::start()
        if (state)
                stop();
 
-       context.addSocketNotifier(this);
-       state=2;  // running but not in poll yet
+       if (eMainloop::isValid(&context))
+       {
+               context.addSocketNotifier(this);
+               state=2;  // running but not in poll yet
+       }
 }
 
 void eSocketNotifier::stop()
@@ -46,29 +49,35 @@ void eTimer::start(long msek, bool singleShot)
        if (bActive)
                stop();
 
-       bActive = true;
-       bSingleShot = singleShot;
-       interval = msek;
-       clock_gettime(CLOCK_MONOTONIC, &nextActivation);
-//     eDebug("this = %p\nnow sec = %d, nsec = %d\nadd %d msec", this, nextActivation.tv_sec, nextActivation.tv_nsec, msek);
-       nextActivation += (msek<0 ? 0 : msek);
-//     eDebug("next Activation sec = %d, nsec = %d", nextActivation.tv_sec, nextActivation.tv_nsec );
-       context.addTimer(this);
+       if (eMainloop::isValid(&context))
+       {
+               bActive = true;
+               bSingleShot = singleShot;
+               interval = msek;
+               clock_gettime(CLOCK_MONOTONIC, &nextActivation);
+//             eDebug("this = %p\nnow sec = %d, nsec = %d\nadd %d msec", this, nextActivation.tv_sec, nextActivation.tv_nsec, msek);
+               nextActivation += (msek<0 ? 0 : msek);
+//             eDebug("next Activation sec = %d, nsec = %d", nextActivation.tv_sec, nextActivation.tv_nsec );
+               context.addTimer(this);
+       }
 }
 
-void eTimer::startLongTimer( int seconds )
+void eTimer::startLongTimer(int seconds)
 {
        if (bActive)
                stop();
 
-       bActive = bSingleShot = true;
-       interval = 0;
-       clock_gettime(CLOCK_MONOTONIC, &nextActivation);
-//     eDebug("this = %p\nnow sec = %d, nsec = %d\nadd %d sec", this, nextActivation.tv_sec, nextActivation.tv_nsec, seconds);
-       if ( seconds > 0 )
-               nextActivation.tv_sec += seconds;
-//     eDebug("next Activation sec = %d, nsec = %d", nextActivation.tv_sec, nextActivation.tv_nsec );
-       context.addTimer(this);
+       if (eMainloop::isValid(&context))
+       {
+               bActive = bSingleShot = true;
+               interval = 0;
+               clock_gettime(CLOCK_MONOTONIC, &nextActivation);
+//             eDebug("this = %p\nnow sec = %d, nsec = %d\nadd %d sec", this, nextActivation.tv_sec, nextActivation.tv_nsec, seconds);
+               if ( seconds > 0 )
+                       nextActivation.tv_sec += seconds;
+//             eDebug("next Activation sec = %d, nsec = %d", nextActivation.tv_sec, nextActivation.tv_nsec );
+               context.addTimer(this);
+       }
 }
 
 void eTimer::stop()
@@ -114,6 +123,11 @@ void eTimer::activate()   // Internal Funktion... called from eApplication
 // mainloop
 ePtrList<eMainloop> eMainloop::existing_loops;
 
+bool eMainloop::isValid(eMainloop *ml)
+{
+       return std::find(existing_loops.begin(), existing_loops.end(), ml) != existing_loops.end();
+}
+
 eMainloop::~eMainloop()
 {
        existing_loops.remove(this);
@@ -126,6 +140,17 @@ eMainloop::~eMainloop()
 void eMainloop::addSocketNotifier(eSocketNotifier *sn)
 {
        int fd = sn->getFD();
+       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;
 }
@@ -140,7 +165,7 @@ void eMainloop::removeSocketNotifier(eSocketNotifier *sn)
                return;
        }
        for (i = notifiers.begin(); i != notifiers.end(); ++i)
-               eDebug("fd=%d, sn=%d", i->second->getFD(), (void*)i->second);
+               eDebug("fd=%d, sn=%p", i->second->getFD(), (void*)i->second);
        eFatal("removed socket notifier which is not present, fd=%d", fd);
 }
 
@@ -214,17 +239,13 @@ int eMainloop::processOneEvent(unsigned int twisted_timeout, PyObject **res, ePy
        }
 
        m_is_idle = 1;
+       ++m_idle_count;
 
        if (this == eApp)
        {
-               gOpcode op;
-               op.dc = 0;
-               op.opcode = gOpcode::flush;
-               gRC::getInstance()->submit(op);
                Py_BEGIN_ALLOW_THREADS
                ret = ::poll(pfd, fdcount, poll_timeout);
                Py_END_ALLOW_THREADS
-               
        } else
                ret = ::poll(pfd, fdcount, poll_timeout);
 
@@ -243,14 +264,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);