// mainloop
ePtrList<eMainloop> eMainloop::existing_loops;
+eMainloop::~eMainloop()
+{
+ existing_loops.remove(this);
+ pthread_mutex_destroy(&recalcLock);
+ for (std::map<int, eSocketNotifier*>::iterator it(notifiers.begin());it != notifiers.end();++it)
+ it->second->stop();
+ while(m_timer_list.begin() != m_timer_list.end())
+ m_timer_list.begin()->stop();
+}
+
void eMainloop::addSocketNotifier(eSocketNotifier *sn)
{
int fd = sn->getFD();
}
}
+ m_is_idle = 1;
+
if (this == eApp)
+ {
Py_BEGIN_ALLOW_THREADS
ret = ::poll(pfd, fdcount, poll_timeout);
Py_END_ALLOW_THREADS
- else
+ } else
ret = ::poll(pfd, fdcount, poll_timeout);
+
+ m_is_idle = 0;
/* ret > 0 means that there are some active poll entries. */
if (ret > 0)
{
timeval now, timeout;
gettimeofday(&now, 0);
- m_twisted_timer -= time_offset;
+ m_twisted_timer += time_offset; // apply pending offset
if (m_twisted_timer<=now) // timeout
return 0;
timeout = m_twisted_timer - now;
to = timeout.tv_sec * 1000 + timeout.tv_usec / 1000;
+ // remove pending offset .. it is re-applied in next call of processOneEvent.. applyTimeOffset
+ m_twisted_timer -= time_offset;
}
ret = processOneEvent(to, res, dict);
} while ( !ret && !(res && *res) );