Micro-optimization

Also fix pending updates not working
This commit is contained in:
Kovid Goyal 2016-10-31 10:56:58 +05:30
parent 4c755c6005
commit 0a6feee71a

View File

@ -8,6 +8,7 @@ import signal
import select import select
import subprocess import subprocess
import struct import struct
from itertools import repeat
from time import monotonic from time import monotonic
from threading import Thread, current_thread from threading import Thread, current_thread
from queue import Queue, Empty from queue import Queue, Empty
@ -38,10 +39,11 @@ class Boss(Thread):
shutting_down = False shutting_down = False
pending_title_change = pending_icon_change = None pending_title_change = pending_icon_change = None
pending_color_changes = {} pending_color_changes = {}
pending_update_screen = None SCREEN_UPDATE_DELAY = 1 / 100 # seconds
def __init__(self, window, window_width, window_height, opts, args): def __init__(self, window, window_width, window_height, opts, args):
Thread.__init__(self, name='ChildMonitor') Thread.__init__(self, name='ChildMonitor')
self.pending_update_screen = None
self.action_queue = Queue() self.action_queue = Queue()
self.child_fd = create_pty()[0] self.child_fd = create_pty()[0]
self.read_wakeup_fd, self.write_wakeup_fd = os.pipe2(os.O_NONBLOCK | os.O_CLOEXEC) self.read_wakeup_fd, self.write_wakeup_fd = os.pipe2(os.O_NONBLOCK | os.O_CLOEXEC)
@ -166,15 +168,16 @@ class Boss(Thread):
s.dump_stats(self.profile) s.dump_stats(self.profile)
def loop(self): def loop(self):
all_readers, all_writers = self.readers, self.writers
dispatch = list(repeat(None, max(all_readers) + 1))
dispatch[self.child_fd] = self.read_ready
dispatch[self.read_wakeup_fd] = self.on_wakeup
dispatch[self.signal_fd] = self.signal_received
while not self.shutting_down: while not self.shutting_down:
readers, writers, _ = select.select(self.readers, self.writers if self.write_buf else [], [], self.pending_update_screen) timeout = None if self.pending_update_screen is None else max(0, self.pending_update_screen - monotonic())
readers, writers, _ = select.select(all_readers, all_writers if self.write_buf else [], [], timeout)
for r in readers: for r in readers:
if r is self.child_fd: dispatch[r]()
self.read_ready()
elif r is self.read_wakeup_fd:
self.on_wakeup()
elif r is self.signal_fd:
self.signal_received()
if writers: if writers:
self.write_ready() self.write_ready()
if self.pending_update_screen is not None and monotonic() > self.pending_update_screen: if self.pending_update_screen is not None and monotonic() > self.pending_update_screen:
@ -232,7 +235,7 @@ class Boss(Thread):
def mark_dirtied(self): def mark_dirtied(self):
# Batch screen updates # Batch screen updates
if self.pending_update_screen is None: if self.pending_update_screen is None:
self.pending_update_screen = monotonic() + 0.01 self.pending_update_screen = monotonic() + self.SCREEN_UPDATE_DELAY
def apply_update_screen(self): def apply_update_screen(self):
self.pending_update_screen = None self.pending_update_screen = None