Replace update_lock with shutdon_event

This commit is contained in:
ZyX 2013-03-24 21:25:55 +04:00
parent 07c2ea1176
commit 80e55b0c81

View File

@ -5,18 +5,17 @@ from __future__ import absolute_import
from powerline.lib.time import monotonic from powerline.lib.time import monotonic
from time import sleep from time import sleep
from threading import Thread, Lock from threading import Thread, Lock, Event
class ThreadedSegment(object): class ThreadedSegment(object):
daemon = True
min_sleep_time = 0.1 min_sleep_time = 0.1
update_first = True update_first = True
interval = 1 interval = 1
def __init__(self): def __init__(self):
super(ThreadedSegment, self).__init__() super(ThreadedSegment, self).__init__()
self.update_lock = Lock() self.shutdown_event = Event()
self.write_lock = Lock() self.write_lock = Lock()
self.keep_going = True self.keep_going = True
self.run_once = True self.run_once = True
@ -50,18 +49,16 @@ class ThreadedSegment(object):
def start(self): def start(self):
self.thread = Thread(target=self.run) self.thread = Thread(target=self.run)
self.thread.daemon = self.daemon
self.thread.start() self.thread.start()
def sleep(self, adjust_time): def sleep(self, adjust_time):
sleep(max(self.interval - adjust_time, self.min_sleep_time)) self.shutdown_event.wait(max(self.interval - adjust_time, self.min_sleep_time))
if self.shutdown_event.is_set():
self.keep_going = False
def run(self): def run(self):
while self.keep_going: while self.keep_going:
start_time = monotonic() start_time = monotonic()
try:
if self.update_lock.acquire(False):
try: try:
self.update() self.update()
except Exception as e: except Exception as e:
@ -69,20 +66,10 @@ class ThreadedSegment(object):
self.skip = True self.skip = True
else: else:
self.skip = False self.skip = False
else:
return
finally:
# Release lock in any case. If it is not locked in this thread,
# it was done in main thread in .shutdown method, and the lock
# will never be released.
self.update_lock.release()
self.sleep(monotonic() - start_time) self.sleep(monotonic() - start_time)
def shutdown(self): def shutdown(self):
if self.keep_going: self.shutdown_event.set()
self.keep_going = False
self.update_lock.acquire()
def set_interval(self, interval=None): def set_interval(self, interval=None):
# Allowing “interval” keyword in configuration. # Allowing “interval” keyword in configuration.