内容简介:数据结构在结构体Server中维护了freeReq, freeResp链表,用于复用request和response。 但是在getRequest函数里, 源码中将freeReq头节点指向第二个节点, 并新建了一个Request{}作为结果返回。正确的做法应该是将头节点从链表中删除,然后将头节点返回,从而达到对象复用的效果。
- 源码位置 net/rpc/server.go
数据结构
// Server represents an RPC Server.
type Server struct {
serviceMap sync.Map // map[string]*service
reqLock sync.Mutex // protects freeReq
freeReq *Request
respLock sync.Mutex // protects freeResp
freeResp *Response
}
// 成员函数
func (server *Server)freeRequest(req *Request)
func (server *Server)getRequest() *Request {
server.reqLock.Lock()
req := server.freeReq
if req == nil {
req =new(Request)
}else {
server.freeReq = req.next
//错误, 此处新建了Request,取代了req原始指向的对象, 应该删除此行,直接返回req, 达到Request对象复用的效果
*req =Request{}
}
server.reqLock.Unlock()
return req
}
在结构体Server中维护了freeReq, freeResp链表,用于复用request和response。 但是在getRequest函数里, 源码中将freeReq头节点指向第二个节点, 并新建了一个Request{}作为结果返回。正确的做法应该是将头节点从链表中删除,然后将头节点返回,从而达到对象复用的效果。
以上所述就是小编给大家介绍的《golang rpc源码问题记录》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 源码安装配置 Nginx 记录
- EventBus源码剖析(4) -- 订阅记录
- history源码解析-管理会话历史记录
- Chrome 小恐龙游戏源码探究六 -- 记录游戏分数
- 【Django源码解析视频更新记录】新增第五章模板专题
- 记录一次vue练习的填坑记录
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux内核设计的艺术
新设计团队 / 机械工业出版社华章公司 / 2011-6-20 / 79.00元
关于Linux内核的书已经不计其数,但这本书却是独树一帜的,它的内容代表着Linux内核研究成果的世界顶尖级水平,它在世界范围内首次提出并阐述了操作系统设计的核心指导思想——主奴机制,这是所有操作系统研究者的一笔宝贵财富。本书可能也代表着同类图书的顶尖水平,是一本真正能引导我们较为容易地、极为透彻地理解Linux内核的经典之作,也可能是当前唯一能从本质上指引我们去设计和开发拥有自主知识产权的操作系......一起来看看 《Linux内核设计的艺术》 这本书的介绍吧!