美文网首页
nanomsg 1.1.5 源代码分析 (一)

nanomsg 1.1.5 源代码分析 (一)

作者: RonZheng2010 | 来源:发表于2018-11-27 21:21 被阅读0次

    1. nn_fsm和actor类

    在nanomsg中,可以向nn_fsm派生类的对象发送event,驱使它工作,并转变状态。这里(不是nanomsg的文档)称这种类为actor类。 nn_fsm包括指向event处理函数的指针,而actor类应该实现自己的处理函数,并用它初始化nn_fsm的指针。
    下图是传输协议为IPC时,“接受连接”过程涉及的主要类。其中nn_ibpc、nn_aip和nn_usock等都是actor类。

    nn_fsm中包括的event处理函数原型如下:

    typedef void (*nn_fsm_fn) (struct nn_fsm *self, int src, int type,void *srcptr);
    

    self指向actor对象包含的nn_fsm成员,可以从还原到actor对象,src是event的源,type是event类型,srcptr是event源指针。
    有了nn_fsm指针,其他对象就可以向它所属的actor对象发送event。使用的函数是:

    void fsm_feed(struct nn_fsm* self, int src, void* srcptr);
    

    nanomsg定义了一个特别的event源action,定义为NN_FSM_ACTION。用nn_fsm_action()发送这种event。

    nn_fsm名字包含“fsm(finite state machine)”,但它并不包括状态机,它只是通过event处理函数驱动actor类的状态机。actor类在自身的state成员中记录自己的状态。(虽然nn_fsm也包含一个state成员,但它只用于表示它自身的状态)

    2. nn_ctx

    nn_poller创建和管理epoll实例,监控若干文件描述符状态。epoll_wait()需要一个超时值,nn_timerset则提供一组超时值。nn_worker包括一个nn_poller和一个nn_timerset。

    nn_thread提供一个独立线程。nn_worker包括一个nn_thread,依托它运行自己的任务。这个任务由nn_worker_routine()执行。

    涉及的类如下:

    在nn_worker_routine()中,nn_worker监控两类文件描述符:一是自己的成员efd,用eventfd()在内部创建,二是来自外部的一般文件描述符,如socket。

    如果是一般的文件描述符,则通知描述符的owner处理;nn_worker用成员efd监控常规任务。常规任务保存在成员tasks中,这是一个任务队列。如果efd状态变化,则依次取出所有任务,通知任务的owner处理。
    如果等待超时,nn_worker通知超时对象的owner处理。
    在上图中,可以看到nn_worker_routine()用nn_ctx做后处理。

    5. nn_global

    nanomsg用nn_global保存全局变量,主要包括一个nn_sock[]数组和一个nn_pool实例。

    nn_sock是nanomsg的socket对象,调用者通过该对象在nn_sock[]中的位置引用它。
    n_pool是nn_worker池。在当前的实现中,它只包括一个nn_worker实例。在其他类中,可以用nn_global_getpool()引用这个池。

    nn_global_init()进行系统初始化。除了初始化nn_sock[]数组和nn_pool之外,它还调用所有底层传输协议的初始化函数。这些协议对象保存在全局数组nn_transports[]数组中。另外,nn_random_seed()初始化随机值,nanomsg创建hash表时要用到它。

    nn_gobal_init()仅在创建第一个nanomsg socket时调用一次。

    相关链接
    nanomsg 1.1.5 源代码分析 (一)
    nanomsg 1.1.5 源代码分析 (二)
    nanomsg 1.1.5 源代码分析 (三)
    nanomsg 1.1.5 源代码分析 (四)

    相关文章

      网友评论

          本文标题:nanomsg 1.1.5 源代码分析 (一)

          本文链接:https://www.haomeiwen.com/subject/rugnqqtx.html