summaryrefslogtreecommitdiffstats
path: root/lib/bb/cooker.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-09 12:54:34 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-09 23:43:30 +0100
commitbf76cd7e5881adf264b8ba64e27a5b6ca9df4fde (patch)
tree56ec0d6488b06789ee3f68eb152a522b58d49901 /lib/bb/cooker.py
parent4d508d35a224e3a25d2d59c8415ab7985964b14f (diff)
downloadbitbake-contrib-bf76cd7e5881adf264b8ba64e27a5b6ca9df4fde.tar.gz
cooker: Ensure we handle inotify before running the next command
The inotify watch events are handled "at idle" which could in theory mean a command could run before any preceeding inotify events have been processed. This leads to a theoretical race window where those events may have a signficicant effect on the command. Add a mechanism to allow us to ensure all pending events are processed before running commands. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib/bb/cooker.py')
-rw-r--r--lib/bb/cooker.py17
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index ea4df266f..77b7f3dde 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -205,15 +205,11 @@ class BBCooker:
self.inotify_modified_files = []
- def _process_inotify_updates(server, notifier_list, abort):
- for n in notifier_list:
- if n.check_events(timeout=0):
- # read notified events and enqeue them
- n.read_events()
- n.process_events()
+ def _process_inotify_updates(server, cooker, abort):
+ cooker.process_inotify_updates()
return 1.0
- self.configuration.server_register_idlecallback(_process_inotify_updates, [self.confignotifier, self.notifier])
+ self.configuration.server_register_idlecallback(_process_inotify_updates, self)
# TOSTOP must not be set or our children will hang when they output
try:
@@ -241,6 +237,13 @@ class BBCooker:
os.write(readypipe, b"ready")
os.close(readypipe)
+ def process_inotify_updates(self):
+ for n in [self.confignotifier, self.notifier]:
+ if n.check_events(timeout=0):
+ # read notified events and enqeue them
+ n.read_events()
+ n.process_events()
+
def config_notifications(self, event):
if event.maskname == "IN_Q_OVERFLOW":
bb.warn("inotify event queue overflowed, invalidating caches.")