1. 創建域套接字,管道以及鎖:
self.configuration = configuration self.featureset = featureset self.sockname = sockname self.bitbake_lock = lock self.readypipe, self.readypipein = os.pipe() # Create server control socket if os.path.exists(sockname): os.unlink(sockname) self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # AF_UNIX has path length issues so chdir here to workaround cwd = os.getcwd() logfile = os.path.join(cwd, "bitbake-cookerdaemon.log") try: os.chdir(os.path.dirname(sockname)) self.sock.bind(os.path.basename(sockname)) finally: os.chdir(cwd) self.sock.listen(1)
2. 創建后台線程執行_startServer:
os.set_inheritable(self.sock.fileno(), True) startdatetime = datetime.datetime.now() bb.daemonize.createDaemon(self._startServer, logfile) self.sock.close() self.bitbake_lock.close()
3. 讀者線程:
ready = ConnectionReader(self.readypipe) r = ready.poll(30) if r: r = ready.get() if not r or r != "ready": ready.close() bb.error("Unable to start bitbake server") if os.path.exists(logfile): logstart_re = re.compile(self.start_log_format % ('([0-9]+)', '([0-9-]+ [0-9:.]+)')) started = False lines = [] with open(logfile, "r") as f: for line in f: if started: lines.append(line) else: res = logstart_re.match(line.rstrip()) if res: ldatetime = datetime.datetime.strptime(res.group(2), self.start_log_datetime_format) if ldatetime >= startdatetime: started = True lines.append(line) if lines: if len(lines) > 10: bb.error("Last 10 lines of server log for this session (%s):\n%s" % (logfile, "".join(lines[-10:]))) else: bb.error("Server log for this session (%s):\n%s" % (logfile, "".join(lines))) raise SystemExit(1) ready.close() os.close(self.readypipein)
4. 寫者線程:
def _startServer(self): print(self.start_log_format % (os.getpid(), datetime.datetime.now().strftime(self.start_log_datetime_format))) server = ProcessServer(self.bitbake_lock, self.sock, self.sockname) self.configuration.setServerRegIdleCallback(server.register_idle_function) writer = ConnectionWriter(self.readypipein) try: self.cooker = bb.cooker.BBCooker(self.configuration, self.featureset) writer.send("ready") except: writer.send("fail") raise finally: os.close(self.readypipein) server.cooker = self.cooker server.server_timeout = self.configuration.server_timeout server.xmlrpcinterface = self.configuration.xmlrpcinterface print("Started bitbake server pid %d" % os.getpid()) server.start()