]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
bitbake: Always use separate process for PR Service
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 6 Feb 2013 15:59:07 +0000 (15:59 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 6 Feb 2013 23:42:03 +0000 (23:42 +0000)
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 <richard.purdie@linuxfoundation.org>
lib/bb/server/process.py
lib/prserv/serv.py

index 8ebf771878555d3764328eb08a9a25307811bed7..5e2cade26771341e8aaf42f09befefbaf4fe83b0 100644 (file)
@@ -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)
 
index d8bdf31ba94422bf4853162d5478a4501e63852f..719941b32ebe9023d013ca552f6bb8b2cb57cd34 100644 (file)
@@ -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():