diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-09 17:58:02 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-10 11:10:01 -0700 |
commit | efdc1598d24a0ca0eec5aa96bfed4d76107ec6b9 (patch) | |
tree | 353f370eea9601b6c4c2a42d2457188027c2be13 /bitbake | |
parent | a445e03d8b89e900319a5d4f9477f9e3383f5be1 (diff) | |
download | poky-efdc1598d24a0ca0eec5aa96bfed4d76107ec6b9.tar.gz |
bitbake: server/process: Use a pipe for quit events instead of Event()
Its not possible to notice the change of status of an Event() in
the select call we sleep in. It would be possible in python 3.3 but
for now use a pipe instead. This removes small latency when bitbake
commands finish since the system doesn't sit in the select call.
(Debugging these kind of issues is apparent by setting a long sleep
for the select call)
(Bitbake rev: def28239b0f0d5f1cf13214b263114a5328538b7)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/server/process.py | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index f4cb32c8aa..386294f580 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
@@ -87,8 +87,7 @@ class ProcessServer(Process, BaseImplServer): | |||
87 | self.featurelist = featurelist | 87 | self.featurelist = featurelist |
88 | self.quit = False | 88 | self.quit = False |
89 | 89 | ||
90 | self.keep_running = Event() | 90 | self.quitin, self.quitout = Pipe() |
91 | self.keep_running.set() | ||
92 | self.event_handle = multiprocessing.Value("i") | 91 | self.event_handle = multiprocessing.Value("i") |
93 | 92 | ||
94 | def run(self): | 93 | def run(self): |
@@ -101,14 +100,18 @@ class ProcessServer(Process, BaseImplServer): | |||
101 | def main(self): | 100 | def main(self): |
102 | # Ignore SIGINT within the server, as all SIGINT handling is done by | 101 | # Ignore SIGINT within the server, as all SIGINT handling is done by |
103 | # the UI and communicated to us | 102 | # the UI and communicated to us |
103 | self.quitin.close() | ||
104 | signal.signal(signal.SIGINT, signal.SIG_IGN) | 104 | signal.signal(signal.SIGINT, signal.SIG_IGN) |
105 | while self.keep_running.is_set(): | 105 | while not self.quit: |
106 | try: | 106 | try: |
107 | if self.command_channel.poll(): | 107 | if self.command_channel.poll(): |
108 | command = self.command_channel.recv() | 108 | command = self.command_channel.recv() |
109 | self.runCommand(command) | 109 | self.runCommand(command) |
110 | if self.quitout.poll(): | ||
111 | self.quitout.recv() | ||
112 | self.quit = True | ||
110 | 113 | ||
111 | self.idle_commands(.1, [self.event_queue._reader, self.command_channel]) | 114 | self.idle_commands(.1, [self.event_queue._reader, self.command_channel, self.quitout]) |
112 | except Exception: | 115 | except Exception: |
113 | logger.exception('Running command %s', command) | 116 | logger.exception('Running command %s', command) |
114 | 117 | ||
@@ -147,7 +150,8 @@ class ProcessServer(Process, BaseImplServer): | |||
147 | self.command_channel.send(self.cooker.command.runCommand(command)) | 150 | self.command_channel.send(self.cooker.command.runCommand(command)) |
148 | 151 | ||
149 | def stop(self): | 152 | def stop(self): |
150 | self.keep_running.clear() | 153 | self.quitin.send("quit") |
154 | self.quitin.close() | ||
151 | 155 | ||
152 | class BitBakeProcessServerConnection(BitBakeBaseServerConnection): | 156 | class BitBakeProcessServerConnection(BitBakeBaseServerConnection): |
153 | def __init__(self, serverImpl, ui_channel, event_queue): | 157 | def __init__(self, serverImpl, ui_channel, event_queue): |