kill off run_in_bg and some related hacks
This commit is contained in:
parent
a92b88ed9d
commit
ae5cd6268a
|
@ -164,12 +164,6 @@ running things in the background and subiquity uses
|
||||||
[trio](https://trio.readthedocs.io/en/stable/) has nicer APIs but is
|
[trio](https://trio.readthedocs.io/en/stable/) has nicer APIs but is
|
||||||
a bit too new for now.
|
a bit too new for now.
|
||||||
|
|
||||||
The older approach which is still present in the codebase is the `run_in_bg`
|
|
||||||
function, which takes two functions: one that takes no arguments and is called
|
|
||||||
in a background thread and a callback that takes one argument, and is called
|
|
||||||
in the main/UI thread with a `concurrent.futures.Future` representing the
|
|
||||||
result of calling the first function.
|
|
||||||
|
|
||||||
A cast-iron rule: Only touch the UI from the main thread.
|
A cast-iron rule: Only touch the UI from the main thread.
|
||||||
|
|
||||||
### Terminal things
|
### Terminal things
|
||||||
|
|
|
@ -34,7 +34,7 @@ class Thing:
|
||||||
|
|
||||||
|
|
||||||
class MiniApplication:
|
class MiniApplication:
|
||||||
ui = signal = loop = run_in_bg = None
|
ui = signal = loop = None
|
||||||
answers = {}
|
answers = {}
|
||||||
opts = Thing()
|
opts = Thing()
|
||||||
opts.dry_run = True
|
opts.dry_run = True
|
||||||
|
|
|
@ -46,7 +46,6 @@ class BaseController(ABC):
|
||||||
# subiquity/controllers/installprogress.py
|
# subiquity/controllers/installprogress.py
|
||||||
self.debug_flags = os.environ.get('SUBIQUITY_DEBUG', '').split(',')
|
self.debug_flags = os.environ.get('SUBIQUITY_DEBUG', '').split(',')
|
||||||
self.loop = app.loop
|
self.loop = app.loop
|
||||||
self.run_in_bg = app.run_in_bg
|
|
||||||
self.app = app
|
self.app = app
|
||||||
self.answers = app.answers.get(self.name, {})
|
self.answers = app.answers.get(self.name, {})
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from concurrent import futures
|
|
||||||
import fcntl
|
import fcntl
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
@ -373,29 +372,8 @@ class Application:
|
||||||
self.signal = Signal()
|
self.signal = Signal()
|
||||||
self.prober = prober
|
self.prober = prober
|
||||||
self.loop = None
|
self.loop = None
|
||||||
self.pool = futures.ThreadPoolExecutor(10)
|
|
||||||
self.controllers = ControllerSet(self, self.controllers)
|
self.controllers = ControllerSet(self, self.controllers)
|
||||||
|
|
||||||
def run_in_bg(self, func, callback):
|
|
||||||
"""Run func() in a thread and call callback on UI thread.
|
|
||||||
|
|
||||||
callback will be passed a concurrent.futures.Future containing
|
|
||||||
the result of func(). The result of callback is discarded. An
|
|
||||||
exception will crash the process so be careful!
|
|
||||||
"""
|
|
||||||
fut = self.pool.submit(func)
|
|
||||||
|
|
||||||
def in_main_thread(ignored):
|
|
||||||
self.loop.remove_watch_pipe(pipe)
|
|
||||||
os.close(pipe)
|
|
||||||
callback(fut)
|
|
||||||
|
|
||||||
pipe = self.loop.watch_pipe(in_main_thread)
|
|
||||||
|
|
||||||
def in_random_thread(ignored):
|
|
||||||
os.write(pipe, b'x')
|
|
||||||
fut.add_done_callback(in_random_thread)
|
|
||||||
|
|
||||||
def run_command_in_foreground(self, cmd, before_hook=None, after_hook=None,
|
def run_command_in_foreground(self, cmd, before_hook=None, after_hook=None,
|
||||||
**kw):
|
**kw):
|
||||||
screen = self.loop.screen
|
screen = self.loop.screen
|
||||||
|
@ -652,9 +630,3 @@ class Application:
|
||||||
except Exception:
|
except Exception:
|
||||||
log.exception("Exception in controller.run():")
|
log.exception("Exception in controller.run():")
|
||||||
raise
|
raise
|
||||||
finally:
|
|
||||||
# concurrent.futures.ThreadPoolExecutor tries to join all
|
|
||||||
# threads before exiting. We don't want that and this
|
|
||||||
# ghastly hack prevents it.
|
|
||||||
from concurrent.futures import thread
|
|
||||||
thread._threads_queues = {}
|
|
||||||
|
|
Loading…
Reference in New Issue