diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2017-02-06 13:31:34 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2017-02-06 13:31:34 -0500 |
commit | 20d0936fa256e0caa41a18a79556c8ade3f8347f (patch) | |
tree | 230424417d2f1b0c148d677ecf3d1003dfd943ac /klippy/reactor.py | |
parent | c24b7a7ef96b6c9770fdf4c821f5719892732033 (diff) | |
download | kutter-20d0936fa256e0caa41a18a79556c8ade3f8347f.tar.gz kutter-20d0936fa256e0caa41a18a79556c8ade3f8347f.tar.xz kutter-20d0936fa256e0caa41a18a79556c8ade3f8347f.zip |
reactor: Use the system monotonic clock instead of the normal system clock
The normal system clock can have sudden jumps if the system clock is
changed. Use the system monotonic clock to avoid these sudden changes
in time.
It appears the Raspbian OS (which is used by OctoPi) is setup to
update the system clock upon network connectivity. This could cause
sudden system clock changes which could lead to Klippy processing
errors. Using the monotonic clock eliminates these issues.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/reactor.py')
-rw-r--r-- | klippy/reactor.py | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/klippy/reactor.py b/klippy/reactor.py index 1adf09a8..1fd8426a 100644 --- a/klippy/reactor.py +++ b/klippy/reactor.py @@ -3,8 +3,9 @@ # Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net> # # This file may be distributed under the terms of the GNU GPLv3 license. -import select, time, math +import select, math import greenlet +import chelper class ReactorTimer: def __init__(self, callback, waketime): @@ -33,6 +34,7 @@ class SelectReactor: self._process = False self._g_dispatch = None self._greenlets = [] + self.monotonic = chelper.get_ffi()[1].get_monotonic # Timers def _note_time(self, t): nexttime = t.waketime @@ -67,7 +69,7 @@ class SelectReactor: self._note_time(t) if eventtime >= self._next_timer: return 0. - return min(1., max(.001, self._next_timer - time.time())) + return min(1., max(.001, self._next_timer - self.monotonic())) # Greenlets def pause(self, waketime): g = greenlet.getcurrent() @@ -97,16 +99,16 @@ class SelectReactor: def _dispatch_loop(self): self._process = True self._g_dispatch = g_dispatch = greenlet.getcurrent() - eventtime = time.time() + eventtime = self.monotonic() while self._process: timeout = self._check_timers(eventtime) res = select.select(self._fds, [], [], timeout) - eventtime = time.time() + eventtime = self.monotonic() for fd in res[0]: fd.callback(eventtime) if g_dispatch is not self._g_dispatch: self._end_greenlet(g_dispatch) - eventtime = time.time() + eventtime = self.monotonic() break self._g_dispatch = None def run(self): @@ -137,16 +139,16 @@ class PollReactor(SelectReactor): def _dispatch_loop(self): self._process = True self._g_dispatch = g_dispatch = greenlet.getcurrent() - eventtime = time.time() + eventtime = self.monotonic() while self._process: timeout = self._check_timers(eventtime) res = self._poll.poll(int(math.ceil(timeout * 1000.))) - eventtime = time.time() + eventtime = self.monotonic() for fd, event in res: self._fds[fd](eventtime) if g_dispatch is not self._g_dispatch: self._end_greenlet(g_dispatch) - eventtime = time.time() + eventtime = self.monotonic() break self._g_dispatch = None @@ -172,16 +174,16 @@ class EPollReactor(SelectReactor): def _dispatch_loop(self): self._process = True self._g_dispatch = g_dispatch = greenlet.getcurrent() - eventtime = time.time() + eventtime = self.monotonic() while self._process: timeout = self._check_timers(eventtime) res = self._epoll.poll(timeout) - eventtime = time.time() + eventtime = self.monotonic() for fd, event in res: self._fds[fd](eventtime) if g_dispatch is not self._g_dispatch: self._end_greenlet(g_dispatch) - eventtime = time.time() + eventtime = self.monotonic() break self._g_dispatch = None |