
libuv源码阅读
两天宇宙人
摸鱼大学僧
展开
-
libuv源码分析(6)uv_queue_work
????问题来由 在使用libuv的过程中,我们难免遇见的一个问题是,有一些库没有异步、只能同步运行,这种情况该怎么办呢?比如mysql-connector-cpp。 首先要说的是,直接在回调函数中执行mysql-connector-cpp这种会阻塞的操作是不符合Libuv的reactor模式的。void handle_json_lab(std::shared_ptr<smpHttp::...原创 2019-11-26 20:58:20 · 2967 阅读 · 0 评论 -
libuv源码分析(5)uv_fs_*
uv_fs_* uv_fs_*这一系列的函数基本是一致的,它们的逻辑大概是如下://x代表一种操作open、write等int uv_fs_x(...uv_fs_t* req...) { INIT(x); //uv_fs_t和其基类uv_req_t的基本初始化 ... //这里是每个操作各自不同对于req的初始化 POST; //提交这个任务}INIT INIT这个宏...原创 2019-11-26 03:41:54 · 513 阅读 · 0 评论 -
libuv源码分析(4)async
uv_async_init libuv中async的开端在uv_loop_init函数中: //前面省略 err = uv_async_init(loop, &loop->wq_async, uv__work_done); if (err) goto fail_async_init; uv__handle_unref(&loop->wq_a...原创 2019-11-26 03:26:34 · 609 阅读 · 0 评论 -
libuv源码分析(3)init_threads
由来 在我们第一次提交io操作时,会有uv_once被调用,来检测是否初始化过线程池,如果没有则立刻初始化线程池。所以说线程池并非一开始在uv_run的时候或者在loop中初始化的,而是在io操作开始前。我以uv_open为例子画一下UML图如下:在uv_open中先初始化req,然后准备提交work,提交前会调用uv_once检测是否初始化线程池,没有则初始化。init_once...原创 2019-11-18 03:05:27 · 463 阅读 · 0 评论 -
libuv源码分析(2)uv__loop_alive
前言 上一篇说了一下整体的事件循环,对于UV_RUN_DEFAULT模式来调用uv_run来说,uv__loop_alive就决定了是否退出,这一篇看一下uv__loop_alive的源码。详情static int uv__loop_alive(const uv_loop_t* loop) { return uv__has_active_handles(loop) || ...原创 2019-11-16 18:31:44 · 821 阅读 · 0 评论 -
libuv源码分析(1)事件循环分析
前言 libuv总是报出一些让人难以理解的错误????,作为一个C的项目,不具有Java、JavaScript、php那样的人气,很难百度到一些问题的答案,甚至google也不行。为了用好libuv,也为了学习吧。我开始看libuv的源码,不知道自己能走多远。。。事件循环这是官方事件循环的示意图。链接->官方图片位置int uv_run(uv_loop_t* loop, uv_r...原创 2019-11-16 17:52:22 · 815 阅读 · 0 评论