From bc8971d122a02ed823acf0758da267dccc584f98 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Thu, 12 May 2016 08:30:35 +0100 Subject: bitbake: bitbake: Convert to python 3 megacommit This needs breaking up into smaller changes. (Bitbake rev: cf51f19aed208a75d38c14cd585d9b9f115e3ba3) Signed-off-by: Richard Purdie --- bitbake/bin/bitbake-worker | 60 ++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 29 deletions(-) (limited to 'bitbake/bin/bitbake-worker') diff --git a/bitbake/bin/bitbake-worker b/bitbake/bin/bitbake-worker index 5fcffddd4d..dfce68d0c9 100755 --- a/bitbake/bin/bitbake-worker +++ b/bitbake/bin/bitbake-worker @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os import sys @@ -10,8 +10,12 @@ import bb import select import errno import signal +import pickle from multiprocessing import Lock +if sys.getfilesystemencoding() != "utf-8": + sys.exit("Please use a locale setting which supports utf-8.\nPython can't change the filesystem locale after loading so we need a utf-8 when python starts or things won't work.") + # Users shouldn't be running this code directly if len(sys.argv) != 2 or not sys.argv[1].startswith("decafbad"): print("bitbake-worker is meant for internal execution by bitbake itself, please don't use it standalone.") @@ -30,19 +34,16 @@ if sys.argv[1].startswith("decafbadbad"): # updates to log files for use with tail try: if sys.stdout.name == '': - sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) + import fcntl + fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL) + fl |= os.O_SYNC + fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl) + #sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) except: pass logger = logging.getLogger("BitBake") -try: - import cPickle as pickle -except ImportError: - import pickle - bb.msg.note(1, bb.msg.domain.Cache, "Importing cPickle failed. Falling back to a very slow implementation.") - - worker_pipe = sys.stdout.fileno() bb.utils.nonblockingfd(worker_pipe) # Need to guard against multiprocessing being used in child processes @@ -62,10 +63,10 @@ if 0: consolelog.setFormatter(conlogformat) logger.addHandler(consolelog) -worker_queue = "" +worker_queue = b"" def worker_fire(event, d): - data = "" + pickle.dumps(event) + "" + data = b"" + pickle.dumps(event) + b"" worker_fire_prepickled(data) def worker_fire_prepickled(event): @@ -91,7 +92,7 @@ def worker_child_fire(event, d): global worker_pipe global worker_pipe_lock - data = "" + pickle.dumps(event) + "" + data = b"" + pickle.dumps(event) + b"" try: worker_pipe_lock.acquire() worker_pipe.write(data) @@ -241,7 +242,7 @@ def fork_off_task(cfg, data, workerdata, fn, task, taskname, appends, taskdepdat bb.utils.process_profilelog(profname) os._exit(ret) else: - for key, value in envbackup.iteritems(): + for key, value in iter(envbackup.items()): if value is None: del os.environ[key] else: @@ -258,22 +259,22 @@ class runQueueWorkerPipe(): if pipeout: pipeout.close() bb.utils.nonblockingfd(self.input) - self.queue = "" + self.queue = b"" def read(self): start = len(self.queue) try: - self.queue = self.queue + self.input.read(102400) + self.queue = self.queue + (self.input.read(102400) or b"") except (OSError, IOError) as e: if e.errno != errno.EAGAIN: raise end = len(self.queue) - index = self.queue.find("") + index = self.queue.find(b"") while index != -1: worker_fire_prepickled(self.queue[:index+8]) self.queue = self.queue[index+8:] - index = self.queue.find("") + index = self.queue.find(b"") return (end > start) def close(self): @@ -289,7 +290,7 @@ class BitbakeWorker(object): def __init__(self, din): self.input = din bb.utils.nonblockingfd(self.input) - self.queue = "" + self.queue = b"" self.cookercfg = None self.databuilder = None self.data = None @@ -326,12 +327,12 @@ class BitbakeWorker(object): except (OSError, IOError): pass if len(self.queue): - self.handle_item("cookerconfig", self.handle_cookercfg) - self.handle_item("workerdata", self.handle_workerdata) - self.handle_item("runtask", self.handle_runtask) - self.handle_item("finishnow", self.handle_finishnow) - self.handle_item("ping", self.handle_ping) - self.handle_item("quit", self.handle_quit) + self.handle_item(b"cookerconfig", self.handle_cookercfg) + self.handle_item(b"workerdata", self.handle_workerdata) + self.handle_item(b"runtask", self.handle_runtask) + self.handle_item(b"finishnow", self.handle_finishnow) + self.handle_item(b"ping", self.handle_ping) + self.handle_item(b"quit", self.handle_quit) for pipe in self.build_pipes: self.build_pipes[pipe].read() @@ -341,12 +342,12 @@ class BitbakeWorker(object): def handle_item(self, item, func): - if self.queue.startswith("<" + item + ">"): - index = self.queue.find("") + if self.queue.startswith(b"<" + item + b">"): + index = self.queue.find(b"") while index != -1: func(self.queue[(len(item) + 2):index]) self.queue = self.queue[(index + len(item) + 3):] - index = self.queue.find("") + index = self.queue.find(b"") def handle_cookercfg(self, data): self.cookercfg = pickle.loads(data) @@ -410,12 +411,12 @@ class BitbakeWorker(object): self.build_pipes[pid].close() del self.build_pipes[pid] - worker_fire_prepickled("" + pickle.dumps((task, status)) + "") + worker_fire_prepickled(b"" + pickle.dumps((task, status)) + b"") def handle_finishnow(self, _): if self.build_pids: logger.info("Sending SIGTERM to remaining %s tasks", len(self.build_pids)) - for k, v in self.build_pids.iteritems(): + for k, v in iter(self.build_pids.items()): try: os.kill(-k, signal.SIGTERM) os.waitpid(-1, 0) @@ -425,6 +426,7 @@ class BitbakeWorker(object): self.build_pipes[pipe].read() try: + sys.stdin = sys.stdin.detach() worker = BitbakeWorker(sys.stdin) if not profiling: worker.serve() -- cgit v1.2.3-54-g00ecf