diff options
-rw-r--r-- | bitbake/lib/bb/__init__.py | 28 | ||||
-rw-r--r-- | bitbake/lib/bb/asyncrpc/serv.py | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/cooker.py | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/server/process.py | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/support/httpserver.py | 4 | ||||
-rw-r--r-- | bitbake/lib/bb/utils.py | 4 | ||||
-rw-r--r-- | bitbake/lib/hashserv/tests.py | 2 |
7 files changed, 35 insertions, 9 deletions
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index cdec9e4d6c..f59c2515b7 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py | |||
@@ -37,6 +37,34 @@ class BBHandledException(Exception): | |||
37 | import os | 37 | import os |
38 | import logging | 38 | import logging |
39 | from collections import namedtuple | 39 | from collections import namedtuple |
40 | import multiprocessing as mp | ||
41 | |||
42 | # Python 3.14 changes the default multiprocessing context from "fork" to | ||
43 | # "forkserver". However, bitbake heavily relies on "fork" behavior to | ||
44 | # efficiently pass data to the child processes. Places that need this should do: | ||
45 | # from bb import multiprocessing | ||
46 | # in place of | ||
47 | # import multiprocessing | ||
48 | |||
49 | class MultiprocessingContext(object): | ||
50 | """ | ||
51 | Multiprocessing proxy object that uses the "fork" context for a property if | ||
52 | available, otherwise goes to the main multiprocessing module. This allows | ||
53 | it to be a drop-in replacement for the multiprocessing module, but use the | ||
54 | fork context | ||
55 | """ | ||
56 | def __init__(self): | ||
57 | super().__setattr__("_ctx", mp.get_context("fork")) | ||
58 | |||
59 | def __getattr__(self, name): | ||
60 | if hasattr(self._ctx, name): | ||
61 | return getattr(self._ctx, name) | ||
62 | return getattr(mp, name) | ||
63 | |||
64 | def __setattr__(self, name, value): | ||
65 | raise AttributeError(f"Unable to set attribute {name}") | ||
66 | |||
67 | multiprocessing = MultiprocessingContext() | ||
40 | 68 | ||
41 | 69 | ||
42 | class NullHandler(logging.Handler): | 70 | class NullHandler(logging.Handler): |
diff --git a/bitbake/lib/bb/asyncrpc/serv.py b/bitbake/lib/bb/asyncrpc/serv.py index a66117acad..953c02ef3e 100644 --- a/bitbake/lib/bb/asyncrpc/serv.py +++ b/bitbake/lib/bb/asyncrpc/serv.py | |||
@@ -11,7 +11,7 @@ import os | |||
11 | import signal | 11 | import signal |
12 | import socket | 12 | import socket |
13 | import sys | 13 | import sys |
14 | import multiprocessing | 14 | from bb import multiprocessing |
15 | import logging | 15 | import logging |
16 | from .connection import StreamConnection, WebsocketConnection | 16 | from .connection import StreamConnection, WebsocketConnection |
17 | from .exceptions import ClientError, ServerError, ConnectionClosedError, InvokeError | 17 | from .exceptions import ClientError, ServerError, ConnectionClosedError, InvokeError |
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 6fce19b464..778cbb5897 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -12,7 +12,7 @@ | |||
12 | import sys, os, glob, os.path, re, time | 12 | import sys, os, glob, os.path, re, time |
13 | import itertools | 13 | import itertools |
14 | import logging | 14 | import logging |
15 | import multiprocessing | 15 | from bb import multiprocessing |
16 | import threading | 16 | import threading |
17 | from io import StringIO, UnsupportedOperation | 17 | from io import StringIO, UnsupportedOperation |
18 | from contextlib import closing | 18 | from contextlib import closing |
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 76b189291d..34b3a2ae9d 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
@@ -13,7 +13,7 @@ | |||
13 | import bb | 13 | import bb |
14 | import bb.event | 14 | import bb.event |
15 | import logging | 15 | import logging |
16 | import multiprocessing | 16 | from bb import multiprocessing |
17 | import threading | 17 | import threading |
18 | import array | 18 | import array |
19 | import os | 19 | import os |
diff --git a/bitbake/lib/bb/tests/support/httpserver.py b/bitbake/lib/bb/tests/support/httpserver.py index 78f7660053..03327e923b 100644 --- a/bitbake/lib/bb/tests/support/httpserver.py +++ b/bitbake/lib/bb/tests/support/httpserver.py | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | import http.server | 5 | import http.server |
6 | import multiprocessing | 6 | from bb import multiprocessing |
7 | import os | 7 | import os |
8 | import traceback | 8 | import traceback |
9 | import signal | 9 | import signal |
@@ -43,7 +43,7 @@ class HTTPService(object): | |||
43 | self.process = multiprocessing.Process(target=self.server.server_start, args=[self.root_dir, self.logger]) | 43 | self.process = multiprocessing.Process(target=self.server.server_start, args=[self.root_dir, self.logger]) |
44 | 44 | ||
45 | # The signal handler from testimage.bbclass can cause deadlocks here | 45 | # The signal handler from testimage.bbclass can cause deadlocks here |
46 | # if the HTTPServer is terminated before it can restore the standard | 46 | # if the HTTPServer is terminated before it can restore the standard |
47 | #signal behaviour | 47 | #signal behaviour |
48 | orig = signal.getsignal(signal.SIGTERM) | 48 | orig = signal.getsignal(signal.SIGTERM) |
49 | signal.signal(signal.SIGTERM, signal.SIG_DFL) | 49 | signal.signal(signal.SIGTERM, signal.SIG_DFL) |
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index d2f11e4377..1b4fb93a30 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
@@ -14,7 +14,7 @@ import logging | |||
14 | import bb | 14 | import bb |
15 | import bb.msg | 15 | import bb.msg |
16 | import locale | 16 | import locale |
17 | import multiprocessing | 17 | from bb import multiprocessing |
18 | import fcntl | 18 | import fcntl |
19 | import importlib | 19 | import importlib |
20 | import importlib.machinery | 20 | import importlib.machinery |
@@ -1174,8 +1174,6 @@ def process_profilelog(fn, pout = None): | |||
1174 | # | 1174 | # |
1175 | def multiprocessingpool(*args, **kwargs): | 1175 | def multiprocessingpool(*args, **kwargs): |
1176 | 1176 | ||
1177 | import multiprocessing.pool | ||
1178 | #import multiprocessing.util | ||
1179 | #multiprocessing.util.log_to_stderr(10) | 1177 | #multiprocessing.util.log_to_stderr(10) |
1180 | # Deal with a multiprocessing bug where signals to the processes would be delayed until the work | 1178 | # Deal with a multiprocessing bug where signals to the processes would be delayed until the work |
1181 | # completes. Putting in a timeout means the signals (like SIGINT/SIGTERM) get processed. | 1179 | # completes. Putting in a timeout means the signals (like SIGINT/SIGTERM) get processed. |
diff --git a/bitbake/lib/hashserv/tests.py b/bitbake/lib/hashserv/tests.py index 5349cd5867..ed1ade749c 100644 --- a/bitbake/lib/hashserv/tests.py +++ b/bitbake/lib/hashserv/tests.py | |||
@@ -11,7 +11,7 @@ from bb.asyncrpc import InvokeError | |||
11 | from .client import ClientPool | 11 | from .client import ClientPool |
12 | import hashlib | 12 | import hashlib |
13 | import logging | 13 | import logging |
14 | import multiprocessing | 14 | from bb import multiprocessing |
15 | import os | 15 | import os |
16 | import sys | 16 | import sys |
17 | import tempfile | 17 | import tempfile |