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 源代码分析 (四)
网友评论