libhv之hio_t分析

上一篇文章解析了fd是怎么与io模型关联。其中最主要的角色扮演者:hio_t

1. hio_thloop的关系

fd的值即hio_t所在loop ios变量中所在的index值。

hio_t = ios[fd]

lua 复制代码
struct hloop_s {
...
 // ios: with fd as array.index
 //io_array保存了和hloop关联的所有hio_t,并且fd的值即hio_t在io_array中的下标
 //hio_t = ios[fd]
    struct io_array             ios;
}
2.hio_thloop绑定

通过hio_gethloop进行绑定

lua 复制代码
hio_t* hio_get(hloop_t* loop, int fd) {
	//如果fd的值大于ios的最大值则重新分配大小
    if (fd >= loop->ios.maxsize) {
        int newsize = ceil2e(fd);
        io_array_resize(&loop->ios, newsize > fd ? newsize : 2*fd);
    }
	
	//如果当前hio_t不存在则重新分配并且初始化
    hio_t* io = loop->ios.ptr[fd];
    if (io == NULL) {
        HV_ALLOC_SIZEOF(io);
        hio_init(io);
        io->event_type = HEVENT_TYPE_IO;
        io->loop = loop;
        io->fd = fd;
        loop->ios.ptr[fd] = io;
    }
	
	//标记hio_t状态已经ready,hio_ready即初始化数据
    if (!io->ready) {
        hio_ready(io);
    }

    return io;
}

hio_t* hread(hloop_t* loop, int fd, void* buf, size_t len, hread_cb read_cb) {
    hio_t* io = hio_get(loop, fd);
...
}

hio_t* hwrite(hloop_t* loop, int fd, const void* buf, size_t len, hwrite_cb write_cb) {
    hio_t* io = hio_get(loop, fd);
...
}
3.hio_tio模型绑定与解除

hio_add与io模型绑定iowatcher_add_event

hio_del与io模型解除绑定iowatcher_del_event

疑问解答

  1. 同一个loop的所有hio_t的readbuf均指向loop本身的readbuf,不会发生数据覆盖么?

答:不会,因为loop工作的前提是单线程模式,所以不存在多个io同时读的问题。

相关推荐
__土块__9 天前
一次 Spring Boot 自动装配机制源码走读:从误用 @Component 到理解 Bean 生命周期
spring boot·源码分析·自动装配·bean生命周期·@configuration·configurationclasspostprocessor·cglib代理
__土块__9 天前
一次 Spring 循环依赖源码走读:从三级缓存误用到 Bean 生命周期深度解析
java·spring·源码分析·aop·bean生命周期·循环依赖·三级缓存
想搞艺术的程序员12 天前
Go map 核心黑魔法:tophash 标记位的极致复用与性能跃升
golang·源码分析·性能
闻道且行之17 天前
C/C++ HTTP 服务:常用方法与实现方式全解析
c语言·c++·http·libhv·curl·mongoose·libcurl
闻道且行之17 天前
libhv 安装与使用全流程教程
c++·http·socket·libhv·c/c++
PokeMa1 个月前
[协程]-[详解]-[协程作用域]-viewModelScope
kotlin·协程·源码分析·viewmodelscope·原理分析·协程作用域
予枫的编程笔记2 个月前
【Redis 源码深究】String 类型的底层秘密:为什么它不直接用 C 语言字符串?
c语言·人工智能·redis·源码分析·后端架构
飞剑神3 个月前
libhv HttpServer 路由函数定义
libhv
燃于AC之乐3 个月前
深入解剖STL Vector:从底层原理到核心接口的灵活运用
开发语言·c++·迭代器·stl·vector·源码分析·底层原理
编程之路从0到13 个月前
React Native之Android端Fabric 架构源码分析
android·react native·源码分析·fabric