Socket::Write

image.png

构建一个WriteRequest, 然后调用StartWrite().

Socket::StartWrite

有一个 _write_head 成员, 每次写入时,会将WriteRequest 地址写入这个成员, 写入操作会返回旧的 req。 如果旧的req存在,则 req->next = old_req,当前线程直接返回。当前的req会在旧req写完之后被写入。

image.png

image.png

这里就是数据写入了。 紧接着会调用 ==IsWriteComplete== 函数,这个函数会取出在当前节点后添加进来的req列表,在后台线程中继续写入 ==KeepWrite==。 如果当前节点写完了,也没有新添加进来的req,那么就直接返回。

image.png

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

image.png

其实上面的意思是,尝试将未写完的节点设置到__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的后面。

image.png

Socket::KeepWrite

image.png

这个函数就简单很多, 批量写入, 写完的设置下状态, 然后req节点后移。

下面就是,取新的req,下层循环继续写。 image.png