bActive = true;
bSingleShot = singleShot;
interval = msek;
- gettimeofday(&nextActivation, 0);
- nextActivation.tv_sec -= context.getTimeOffset();
-// eDebug("this = %p\nnow sec = %d, usec = %d\nadd %d msec", this, nextActivation.tv_sec, nextActivation.tv_usec, 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, usec = %d", nextActivation.tv_sec, nextActivation.tv_usec );
+// eDebug("next Activation sec = %d, nsec = %d", nextActivation.tv_sec, nextActivation.tv_nsec );
context.addTimer(this);
}
bActive = bSingleShot = true;
interval = 0;
- gettimeofday(&nextActivation, 0);
- nextActivation.tv_sec -= context.getTimeOffset();
-// eDebug("this = %p\nnow sec = %d, usec = %d\nadd %d sec", this, nextActivation.tv_sec, nextActivation.tv_usec, seconds);
+ 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, usec = %d", nextActivation.tv_sec, nextActivation.tv_usec );
+// eDebug("next Activation sec = %d, nsec = %d", nextActivation.tv_sec, nextActivation.tv_nsec );
context.addTimer(this);
}
/*emit*/ timeout();
}
-void eTimer::addTimeOffset( int offset )
-{
- nextActivation.tv_sec += offset;
-}
-
// 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())
if (!m_timer_list.empty() || twisted_timeout > 0)
{
- applyTimeOffset();
if (!m_timer_list.empty())
{
/* process all timers which are ready. first remove them out of the list. */
while (!m_timer_list.empty() && (poll_timeout = timeout_usec( m_timer_list.begin()->getNextActivation() ) ) <= 0 )
- {
m_timer_list.begin()->activate();
- applyTimeOffset();
- }
if (poll_timeout < 0)
poll_timeout = 0;
else /* convert us to ms */
if (additional)
{
+#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
+ typedef int Py_ssize_t;
+# define PY_SSIZE_T_MAX INT_MAX
+# define PY_SSIZE_T_MIN INT_MIN
+#endif
PyObject *key, *val;
- int pos=0;
+ Py_ssize_t pos=0;
while (PyDict_Next(additional, &pos, &key, &val)) {
pfd[i].fd = PyObject_AsFileDescriptor(key);
pfd[i++].events = PyInt_AsLong(val);
Py_END_ALLOW_THREADS
} else
ret = ::poll(pfd, fdcount, poll_timeout);
-
+
m_is_idle = 0;
/* ret > 0 means that there are some active poll entries. */
if (twisted_timeout)
{
- gettimeofday(&m_twisted_timer, 0);
+ clock_gettime(CLOCK_MONOTONIC, &m_twisted_timer);
m_twisted_timer += twisted_timeout;
}
int to = 0;
if (twisted_timeout)
{
- timeval now, timeout;
- gettimeofday(&now, 0);
- m_twisted_timer += time_offset; // apply pending offset
+ timespec now, timeout;
+ clock_gettime(CLOCK_MONOTONIC, &now);
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;
+ to = timeout.tv_sec * 1000 + timeout.tv_nsec / 1000000;
}
ret = processOneEvent(to, res, dict);
} while ( !ret && !(res && *res) );
app_quit_now = true;
}
-void eMainloop::addTimeOffset(int offset)
-{
- for (ePtrList<eMainloop>::iterator it(existing_loops.begin()); it != existing_loops.end(); ++it )
- it->addInstanceTimeOffset(offset);
-}
-
-void eMainloop::addInstanceTimeOffset(int offset)
-{
- singleLock s(recalcLock);
- if (m_timer_list.empty())
- time_offset=0;
- else
- {
- if ( time_offset )
- eDebug("time_offset %d avail.. add new offset %d than new is %d",
- time_offset, offset, time_offset+offset);
- time_offset+=offset;
- }
-}
-
-void eMainloop::applyTimeOffset()
-{
- singleLock s(recalcLock);
- if ( time_offset )
- {
- for (ePtrList<eTimer>::iterator it(m_timer_list.begin()); it != m_timer_list.end(); ++it )
- it->addTimeOffset( time_offset );
- m_twisted_timer += time_offset;
- time_offset=0;
- }
-}
-
eApplication* eApp = 0;
#include "structmember.h"
eTimerPy_is_active(eTimerPy* self)
{
PyObject *ret = NULL;
- ret = !!self->tm->isActive() ? Py_True : Py_False;
+ ret = self->tm->isActive() ? Py_True : Py_False;
Org_Py_INCREF(ret);
return ret;
}