Socket::Write
构建一个WriteRequest, 然后调用StartWrite().
Socket::StartWrite
有一个 _write_head 成员, 每次写入时,会将WriteRequest 地址写入这个成员, 写入操作会返回旧的 req。 如果旧的req存在,则 req->next = old_req,当前线程直接返回。当前的req会在旧req写完之后被写入。
这里就是数据写入了。 紧接着会调用 ==IsWriteComplete== 函数,这个函数会取出在当前节点后添加进来的req列表,在后台线程中继续写入 ==KeepWrite==。 如果当前节点写完了,也没有新添加进来的req,那么就直接返回。
compare_exchange_strong
这是原子操作的一种, 函数原型为:
bool compare_exchange_strong (T& expected, T val,
memory_order sync = memory_order_seq_cst)
它是atomic类模板的一个成员函数。 Compares the contents of the contained value with expected:
- if true, it replaces the contained value with val (like store).
- if false, it replaces expected with the contained value .
Socket::IsWriteComplete
其实上面的意思是,尝试将未写完的节点设置到__write_head 上, 如果两者一致(没有被设置新的req)则设置成功, 那么此时会返回false, 后续会继续处理未写完的节点。如果没有未完成的节点,那么直接返回true了。
如果设置失败了,说明__write_head 被换成新的req了,函数的后面会将这些新的节点反转一下,挂在old_head上。
==总结,这个函数就是==,
- 如果没有新的req, 则设置 desired 到 _write_head。
- desired 分两种情况:
- 1 old_head没写完 或者 old_head 不是单节点,此时都有没写完的数据在。需要返回false,desired就是 old_head, _write_head相当于没变。
- 2 old_head 写完了, 且是单节点, 此时返回true就行了, desired是null, _write_head也被设置为null。
- 如果有新的req,则需要取出新的req_list , 反转一下, 挂在old_head的后面。
Socket::KeepWrite
这个函数就简单很多, 批量写入, 写完的设置下状态, 然后req节点后移。
下面就是,取新的req,下层循环继续写。
标签:write,head,brpc,old,Socket,req,写入,Write,节点 From: https://blog.51cto.com/u_15370559/6366362