前面讲到BitbakeServer实际上是一个ProcessServer,因此对ProcessServer进行了一个大略的分析集,这里着重再介绍一下ProcessServer.main。

1. 初始化

    def main(self):
self.cooker.pre_serve()                                                                  #调用cooker.pre_serve(),进入服务前的一些动作,这个后面继续分解
 
bb.utils.set_process_name("Cooker")                                                      #设置本进程名称为“Cooker” ready = []                                                                               #声明一个列表,这个列表从后文看列应该是一个套接字描述符列表 self.controllersock = False                                                              #声明本服务为非控制器套接字
fds = [self.sock]                                                                        #将本服务套接字添加进文件描述符列表fds
if self.xmlrpc:
fds.append(self.xmlrpc)                                                              #若支持xmlrpc,那么将xmlrpc同样放入文件描述符列表
print("Entering server connection loop")                                                 #即将进入服务器连接循环 def disconnect_client(self, fds):                                                        #定义一个断开客户连接的函数,后面会要用到                                                       
if not self.haveui:
return
print("Disconnecting Client")                                                  
fds.remove(self.controllersock)                                                      #从文件描述符列表中删除控制器套接字描述符                                                   
fds.remove(self.command_channel)                                                     #从文件描述符列表中删除命令通道套接字描述符,从这两处并列的删除步骤看,服务器接受两个套接字
bb.event.unregister_UIHhandler(self.event_handle, True)                              #从事件处理器中删除本事件处理器
self.command_channel_reply.writer.close()                                            #关闭命令通道写端
self.event_writer.writer.close()                                                     #关闭事件写端
del self.event_writer                                                                #析构事件作者
self.controllersock.close()                                                          #控制器套接字关闭
self.controllersock = False
self.haveui = False
self.lastui = time.time()
self.cooker.clientComplete()                                                         #调用cooker.clientComplete函数,后面再进行分解
if self.timeout is None:
print("No timeout, exiting.")
self.quit = True

2. 服务器连接循环

        while not self.quit:
if self.sock in ready:                                                               #假设本套接字在ready列表,那么从本套接字接受一个控制器套接字连入,初始本套接字并不在ready列表
self.controllersock, address = self.sock.accept()
if self.haveui:
print("Dropping connection attempt as we have a UI %s" % (str(ready)))
self.controllersock.close()
else:
print("Accepting %s" % (str(ready)))
fds.append(self.controllersock)                                              #将控制器套接字添加到文件描述符列表
if self.controllersock in ready:                                                     #若控制器套接字就绪,则从控制器套接字接受新的ui文件描述符
try:
print("Connecting Client")
ui_fds = recvfds(self.controllersock, 3)                                     #根据控制器套接字中取3个套接字,分别用于事件作者,命令通道作者,命令通道读者 # Where to write events to
writer = ConnectionWriter(ui_fds[0])                                         #新建连接作者,用于事件处理
self.event_handle = bb.event.register_UIHhandler(writer, True)               #新建本事件处理器
self.event_writer = writer # Where to read commands from
reader = ConnectionReader(ui_fds[1])                                         #新建连接命令通道读者
fds.append(reader)                                                           #将读者添加进文件描述符列表
self.command_channel = reader # Where to send command return values to
writer = ConnectionWriter(ui_fds[2])                                         #新建连接命令通道作者,用于向客户发出回应
self.command_channel_reply = writer self.haveui = True except (EOFError, OSError):
disconnect_client(self, fds)                                                 #出现异常则断开客户连接 if not self.timeout == -1.0 and not self.haveui and self.lastui and self.timeout and \
(self.lastui + self.timeout) < time.time():
print("Server timeout, exiting.")
self.quit = True if self.command_channel in ready:                                                    #命令通道就绪,从命令通道中读取一条命令
try:
command = self.command_channel.get()
except EOFError:
# Client connection shutting down
ready = []
disconnect_client(self, fds)                                                 #出现异常则断开客户连接
continue
if command[0] == "terminateServer":
self.quit = True
continue
try:个
print("Running command %s" % command)
self.command_channel_reply.send(self.cooker.command.runCommand(command))    #执行接收到的命令并且构造响应
                except Exception as e:
                   logger.exception('Exception in server main event loop running command %s (%s)' % (command, str(e)))             if self.xmlrpc in ready:                                                            #xmlrpc就绪,处理xmlrpc请求。
                self.xmlrpc.handle_requests()                                                     ready = self.idle_commands(.1, fds)                                                 #从套接字中获取就绪的套接字

3. 退出清理

        print("Exiting")
# Remove the socket file so we don't get any more connections to avoid races
os.unlink(self.sockname)                                                                #删除域套接字文件
self.sock.close()                                                                       #关闭本套接字,这里顺序上存疑 try:
self.cooker.shutdown(True)                                                          #关闭cooker
self.cooker.notifier.stop()                                                         #停止notify
self.cooker.confignotifier.stop()                                                   #停止confignotify
except:
pass self.cooker.post_serve()                                                                #调用cooker.post_serve(),这个在后面进行分解 # Finally release the lockfile but warn about other processes holding it open
lock = self.bitbake_lock                               
lockfile = lock.name
lock.close()                                                                            #关闭bitbake_lock
lock = None while not lock:
with bb.utils.timeout(3):
lock = bb.utils.lockfile(lockfile, shared=False, retry=False, block=True)
if not lock:
# Some systems may not have lsof available
procs = None
try:
procs = subprocess.check_output(["lsof", '-w', lockfile], stderr=subprocess.STDOUT)
except OSError as e:
if e.errno != errno.ENOENT:
raise
if procs is None:
# Fall back to fuser if lsof is unavailable
try:
procs = subprocess.check_output(["fuser", '-v', lockfile], stderr=subprocess.STDOUT)
except OSError as e:
if e.errno != errno.ENOENT:
raise msg = "Delaying shutdown due to active processes which appear to be holding bitbake.lock"
if procs:
msg += ":\n%s" % str(procs)
print(msg)
return
# We hold the lock so we can remove the file (hide stale pid data)
bb.utils.remove(lockfile)
bb.utils.unlockfile(lock)

yocto-sumo源码解析(九): ProcessServer.main的更多相关文章

  1. ReactiveSwift源码解析(九) SignalProducerProtocol延展中的Start、Lift系列方法的代码实现

    上篇博客我们聊完SignalProducer结构体的基本实现后,我们接下来就聊一下SignalProducerProtocol延展中的start和lift系列方法.SignalProducer结构体的 ...

  2. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  3. Scala 深入浅出实战经典 第65讲:Scala中隐式转换内幕揭秘、最佳实践及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  4. Alink漫谈(十九) :源码解析 之 分位点离散化Quantile

    Alink漫谈(十九) :源码解析 之 分位点离散化Quantile 目录 Alink漫谈(十九) :源码解析 之 分位点离散化Quantile 0x00 摘要 0x01 背景概念 1.1 离散化 1 ...

  5. Mybaits 源码解析 (九)----- 全网最详细,没有之一:一级缓存和二级缓存源码分析

    像Mybatis.Hibernate这样的ORM框架,封装了JDBC的大部分操作,极大的简化了我们对数据库的操作. 在实际项目中,我们发现在一个事务中查询同样的语句两次的时候,第二次没有进行数据库查询 ...

  6. SpringBoot 源码解析 (九)----- Spring Boot的核心能力 - 整合Mybatis

    本篇我们在SpringBoot中整合Mybatis这个orm框架,毕竟分析一下其自动配置的源码,我们先来回顾一下以前Spring中是如何整合Mybatis的,大家可以看看我这篇文章Mybaits 源码 ...

  7. Netty 源码解析(九): connect 过程和 bind 过程分析

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第九篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...

  8. springboot源码解析-管中窥豹系列之自动装配(九)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  9. Redis系列(九):数据结构Hash源码解析和HSET、HGET命令

    2.源码解析 1.相关命令如下: {"hset",hsetCommand,,"wmF",,NULL,,,,,}, {"hsetnx",hse ...

  10. spring 源码解析

    1. [文件] spring源码.txt ~ 15B     下载(167) ? 1 springн┤┬вио╬Ш: 2. [文件] spring源码分析之AOP.txt ~ 15KB     下载( ...

随机推荐

  1. BZOJ3160:万径人踪灭(FFT,Manacher)

    Solution $ans=$回文子序列$-$回文子串的数目. 后者可以用$manacher$直接求. 前者设$f[i]$表示以$i$为中心的对称的字母对数. 那么回文子序列的数量也就是$\sum_{ ...

  2. Redis基本数据类型命令汇总

    前言   前阶段写Redis客户端作为学习和了解Redis Protocol,基本上把Strintg,List,Hash,Set,SortedSet五种基础类型的命令都写完了,本篇进行总结,也相当于复 ...

  3. java基础二 java的跨平台特性

    一:java跨平台的特性: 1.生成不平台无关系的字节码. 2.通过和平台有关的jvm即java虚拟机来执行字节码.jvm不跨平台. 图示: 疑问:1.为什么我们不直接写字节码? 因为字节码只有jvm ...

  4. 论文笔记 M. Saquib Sarfraz_Pose-Sensitive Embedding_re-ranking_2018_CVPR

    1. 摘要 作者使用一个pose-sensitive-embddding,把姿态的粗糙.精细信息结合在一起应用到模型中. 用一个新的re-ranking方法,不需要重新计算新的ranking列表,是一 ...

  5. pyhon 列表的增删改查

    li = ['alex', 'wusir', 'egon', '女神', 'taibai'] l1 = li[2] print(l1) #增加 append() 增加到最后 insert(index, ...

  6. python3爬虫-使用requests爬取起点小说

    import requests from lxml import etree from urllib import parse import os, time def get_page_html(ur ...

  7. 人生苦短,我用python

    星空不问赶路人,时光不负有心人,你可以脱变. 1.计算机的初步认识 2.解释器的安装 python2.7(2020年官方不在维护) python3.6 (官方推荐) 1.下载安装包 https://w ...

  8. 【转】Netty 拆包粘包和服务启动流程分析

    原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...

  9. 20154327 Exp9 Web安全基础

    基础问题回答 (1)SQL注入攻击原理,如何防御 原理: 程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,攻击者利用SQL命令欺骗服务器执行恶意的SQL命令,获得某些他想得知的数据. 防御 ...

  10. OSG漫游到指定坐标点位置

    OSG中从当前场景位置漫游到指定点坐标位置,osg中场景的视口状态包括如下参数: 1.视点的位置 2.参考点的位置,该点通常为场景中的中心轴上的点 3.视点向上的方向向量 ( const osg::V ...