libhv之hio_t分析

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

1. hio_t与hloop的关系

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

hio_t = iosfd

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_t与hloop绑定

通过hio_get与hloop进行绑定

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_t与io模型绑定与解除

hio_add与io模型绑定iowatcher_add_event

hio_del与io模型解除绑定iowatcher_del_event

疑问解答

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

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

相关推荐
程序员大阳18 小时前
副队长BootStrap5探究(8)--输入框组 input group
源码分析·bootstrap5·输入框组·input group
程序员大阳19 小时前
副队长BootStrap5探究(10)--复选框 check
源码分析·复选框·bootstrap5·check
程序员大阳2 天前
副队长BootStrap5探究(5)--图片 Image
源码分析·image·图片·bootstrap5
程序员大阳2 天前
副队长BootStrap5探究(6)--画像 Figure (图文组合组件)
源码分析·figure·图文混排·bootstrap5·画像·图文组合
Flynn Liang4 天前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
JWASX6 天前
【Go】map 源码解析 - group
后端·golang·map·源码分析
利威尔xu11 天前
万字详解|Go 进阶(五):sync 包底层:Mutex 自旋 4 次转饥饿,WaitGroup 漏 1 个 Done 挂起 3000 goroutine
后端·golang·并发编程·源码分析·sync
letisgo52 个月前
JAVA 高级进阶05篇《Spring容器机制:Bean生命周期与三级缓存全解》
java·spring·面试·ioc·源码分析
JMchen1232 个月前
【Android 性能优化实战 60 讲】06 GPU 呈现模式与卡顿视觉验证:拆解柱状图分层,秒辨渲染慢与等待慢
android·性能优化·实战·源码分析·渲染优化·gpu呈现模式·卡顿优化
JMchen1232 个月前
【Android 性能优化实战 60 讲】04 Memory Profiler 高阶玩法:深剖堆内存原理,实战定位 Kotlin 闭包隐式泄漏
android·性能优化·kotlin·实战·源码分析·内存泄漏·memory profiler