lemonbar: Breakout condition logic to Shelf class
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import threading
|
||||||
import subprocess, os
|
import subprocess, os
|
||||||
import re # regexp
|
import re # regexp
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
@@ -48,3 +49,28 @@ def create_new_fifo(fifo_file):
|
|||||||
logger.error('''Failed, couldn't create fifo file''')
|
logger.error('''Failed, couldn't create fifo file''')
|
||||||
os.remove(config.pid_file) # Clean up own PID file
|
os.remove(config.pid_file) # Clean up own PID file
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
class Shelf():
|
||||||
|
# A one-slot queue implemented with locks and condition objects
|
||||||
|
def __init__(self, item = None):
|
||||||
|
self.lock = threading.Lock()
|
||||||
|
self.item_ready = threading.Condition(self.lock)
|
||||||
|
self.item = item
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
# Consumes item
|
||||||
|
self.item_ready.acquire()
|
||||||
|
if self.item is None:
|
||||||
|
# Wait until becomes ready
|
||||||
|
self.item_ready.wait()
|
||||||
|
ret = self.item
|
||||||
|
self.item = None
|
||||||
|
self.item_ready.release()
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def put(self, item):
|
||||||
|
# Discards previous item
|
||||||
|
self.item_ready.acquire()
|
||||||
|
self.item = item
|
||||||
|
self.item_ready.notify()
|
||||||
|
self.item_ready.release()
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ if __name__ == "__main__":
|
|||||||
common.health_logger = logging.getLogger('Health logger')
|
common.health_logger = logging.getLogger('Health logger')
|
||||||
common.health_logger.addHandler(handler)
|
common.health_logger.addHandler(handler)
|
||||||
|
|
||||||
# common.logger.basicConfig(stream=sys.stdout, level=debuglvl)
|
# Make sure no other instance running and ensure clean up on exit
|
||||||
assert_only_instance() # Creates pid file and fifo file
|
assert_only_instance() # Creates pid file and fifo file
|
||||||
atexit.register(clean_up)
|
atexit.register(clean_up)
|
||||||
signal.signal(signal.SIGTERM, handle_exit)
|
signal.signal(signal.SIGTERM, handle_exit)
|
||||||
|
|||||||
@@ -92,35 +92,21 @@ class DateTimeModule(LemonModule):
|
|||||||
class DateTimeThread(threading.Thread):
|
class DateTimeThread(threading.Thread):
|
||||||
def __init__(self, secs_mode = False):
|
def __init__(self, secs_mode = False):
|
||||||
self.secs_mode = secs_mode
|
self.secs_mode = secs_mode
|
||||||
self.readline = self.__readline_first
|
self.last_output = ''
|
||||||
self.output = ''
|
|
||||||
|
|
||||||
lock = threading.Lock()
|
self.shelf = common.Shelf()
|
||||||
self.output_ready = threading.Condition(lock)
|
self.readline = self.shelf.get
|
||||||
self.clock_tick = threading.Condition(lock) # Needed, because sleep may be interrupted when user
|
self.clock_tick = threading.Condition(self.shelf.lock) # Needed, because sleep may be
|
||||||
# changes H:M to H:M:S
|
# interrupted when user changes H:M to H:M:S
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
def __readline_first(self):
|
|
||||||
# Should return instantly the first time
|
|
||||||
self.readline = self.__readline_blocking
|
|
||||||
return self.output
|
|
||||||
|
|
||||||
def __readline_blocking(self):
|
|
||||||
self.output_ready.acquire()
|
|
||||||
self.output_ready.wait()
|
|
||||||
self.output_ready.release()
|
|
||||||
return self.output
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
while True:
|
while True:
|
||||||
fmt = "%a %d %b %H:%M:%S" if self.secs_mode else "%a %d %b %H:%M"
|
fmt = "%a %d %b %H:%M:%S" if self.secs_mode else "%a %d %b %H:%M"
|
||||||
timestr = time.strftime(fmt, time.localtime())
|
timestr = time.strftime(fmt, time.localtime())
|
||||||
if timestr != self.output:
|
if timestr != self.last_output:
|
||||||
self.output = timestr
|
self.last_output = timestr
|
||||||
self.output_ready.acquire()
|
self.shelf.put(timestr)
|
||||||
self.output_ready.notify()
|
|
||||||
self.output_ready.release()
|
|
||||||
self.sleep_until_change()
|
self.sleep_until_change()
|
||||||
|
|
||||||
def sleep_until_change(self):
|
def sleep_until_change(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user