From: Richard Purdie Date: Wed, 6 Feb 2013 15:59:07 +0000 (+0000) Subject: bitbake: Always use separate process for PR Service X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2d0bbd9398ab839bd2d1e29e50b25d52efb1ce2a;p=thirdparty%2Fopenembedded%2Fopenembedded-core-contrib.git bitbake: Always use separate process for PR Service Using the threading module interacts badly with multiprocessing used elsewhere in bitbake under certain machine loads. This was leading to bitbake hanging on Ctrl+C when the PR Server was being used. This patch converts it to always use the daemonize code which then means the threading code isn't required. [YOCTO #3742] Signed-off-by: Richard Purdie --- diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py index 8ebf7718785..5e2cade2677 100644 --- a/lib/bb/server/process.py +++ b/lib/bb/server/process.py @@ -266,5 +266,5 @@ class BitBakeServer(object): return self.connection def launchUI(self, uifunc, *args): - return bb.cooker.server_main(self.cooker, uifunc, *args) + return uifunc(*args) diff --git a/lib/prserv/serv.py b/lib/prserv/serv.py index d8bdf31ba94..719941b32eb 100644 --- a/lib/prserv/serv.py +++ b/lib/prserv/serv.py @@ -97,16 +97,7 @@ class PRServer(SimpleXMLRPCServer): return def start(self): - if self.daemon is True: - logger.info("PRServer: try to start daemon...") - self.daemonize() - else: - atexit.register(self.delpid) - pid = str(os.getpid()) - pf = file(self.pidfile, 'w+') - pf.write("%s\n" % pid) - pf.close() - self.work_forever() + self.daemonize() def delpid(self): os.remove(self.pidfile) @@ -118,6 +109,7 @@ class PRServer(SimpleXMLRPCServer): try: pid = os.fork() if pid > 0: + os.waitpid(pid, 0) #parent return instead of exit to give control return except OSError as e: @@ -131,7 +123,7 @@ class PRServer(SimpleXMLRPCServer): try: pid = os.fork() if pid > 0: #parent - sys.exit(0) + os._exit(0) except OSError as e: raise Exception("%s [%d]" % (e.strerror, e.errno)) @@ -155,7 +147,7 @@ class PRServer(SimpleXMLRPCServer): pf.close() self.work_forever() - sys.exit(0) + os._exit(0) class PRServSingleton(): def __init__(self, dbfile, logfile, interface): @@ -164,21 +156,14 @@ class PRServSingleton(): self.interface = interface self.host = None self.port = None - self.event = threading.Event() - def _work(self): - self.prserv = PRServer(self.dbfile, self.logfile, self.interface, False) + def start(self): + self.prserv = PRServer(self.dbfile, self.logfile, self.interface) + self.prserv.start() self.host, self.port = self.prserv.getinfo() - self.event.set() - self.prserv.work_forever() del self.prserv.db - def start(self): - self.working_thread = threading.Thread(target=self._work) - self.working_thread.start() - def getinfo(self): - self.event.wait() return (self.host, self.port) class PRServerConnection():