glusterfs4.0.1event模块分析笔记1(代码片段)

robinfox robinfox     2022-11-04     388

关键词:

1. 前言

在C语言i中,存储变量的结构体加上一组函数指针,大概就可以算是一个对象模型了;如果将一组函数指针捆绑为结构体,

后期根据配置或者环境需要绑定到不同实现模块中的一组函数,可以认为是C语言面对对象的设计实现了。

2. 概述

事件模型,定义在"libgusterfs/src/"下几个文件中:

event.h    // 事件模型的接口定义:各个结构体的定义
event.c    // 实现了最基本的模型的管理相关的函数
eventpool.c // pool模式 具体的实现
eventepoll.c // epool模式,具体的实现

我们首先看看如何定义事件管理模型:

struct event_pool 
	struct event_ops *ops;          // 一组函数指针,

	int fd;                         // 文件操作符
	int breaker[2];

	int count;
	struct event_slot_poll  *reg;                          // poll 模式使用的,定义于eventpool.c
	struct event_slot_epoll *ereg[EVENT_EPOLL_TABLES];     // 定义于eventepoll.c
	int slots_used[EVENT_EPOLL_TABLES];                    // #define  EVENT_EPOLL_TABLES 1024

	int used;
	int changed;

	pthread_mutex_t mutex;
	pthread_cond_t cond;

	void *evcache;
	int evcache_size;

        /* 备注: 目前当使用Epoll模式工作时候使用下面部分代码 */
int eventthreadcount; /* 内部执行线程个数 */ pthread_t pollers[EVENT_MAX_THREADS]; /* poller 线程ID 集合 */ int destroy; int activethreadcount; /* * 自动缩放的线程数, 这个数加到已经配置的线程数上. 这仅仅适用于server端, 因为我们将试图将线程数匹配 * bricks的数目. 对客户或者 GlusterD来说, * 这个变量一直为0。 * * 下一步: 也会考虑为客户端缩放线程数。 */ int auto_thread_count; ;

 这个结构体包括了poll和epoll两种工作模式的不同实现。

接着定义了一组函数指针:

struct event_ops 
struct event_pool * (*new) (int count, int eventthreadcount); int (*event_register) (struct event_pool *event_pool, int fd, event_handler_t handler, void *data, int poll_in, int poll_out); int (*event_select_on) (struct event_pool *event_pool, int fd, int idx, int poll_in, int poll_out); int (*event_unregister) (struct event_pool *event_pool, int fd, int idx); int (*event_unregister_close) (struct event_pool *event_pool, int fd, int idx); int (*event_dispatch) (struct event_pool *event_pool); int (*event_reconfigure_threads) (struct event_pool *event_pool, int newcount); int (*event_pool_destroy) (struct event_pool *event_pool); int (*event_handled) (struct event_pool *event_pool, int fd, int idx, int gen); ;

 这组函数指针在具体实现中将绑定具体的实现,绑定的过程定义于event_pool_new (int count, int eventthreadcount):

 

struct event_pool * event_pool_new (int count, int eventthreadcount)

        struct event_pool *event_pool = NULL;     // 返回值
	extern struct event_ops event_ops_poll;   // 引用外部结构体,见  eventpool.c  最后面部分

#ifdef HAVE_SYS_EPOLL_H                           // 如果支持epoll
	extern struct event_ops event_ops_epoll;  // 引用外部结构体,见 eventepool.c 最后面部分
        event_pool = event_ops_epoll.new (count, eventthreadcount);    // 执行pool模块的生成函数
        if (event_pool)    
       
                event_pool->ops = &event_ops_epoll;                    // 绑定该模块的操作函数
         
    else         
       
                gf_msg ("event", GF_LOG_WARNING, 0, LG_MSG_FALLBACK_TO_POLL, "falling back to poll based event handling");
        
#endif

        if (!event_pool)        
       
                event_pool = event_ops_poll.new (count, eventthreadcount);     // 执行epool模块的生成函数

                if (event_pool)
                        event_pool->ops = &event_ops_poll;                     // 绑定该模块的操作函数
        

        return event_pool;

 

而整个event.c中定义的各个函数,仅仅是调用绑定pool或者epoll实现的各个函数。举例如下:

 

int event_select_on (struct event_pool *event_pool, int fd, int idx_hint, int poll_in, int poll_out)

       int ret = event_pool->ops->event_select_on (event_pool, fd, idx_hint, poll_in, poll_out);
    return ret;

 

 3. epoll 模型的实现

我们首先看看典型的epoll模型如何实现:epoll模型和使用详解(精髓)epoll - I/O event notification facility

未完待续

glusterfs4.0.1iobuf分析笔记

1、iobuf用来收发数据时候使用的缓冲区,由iobuf_pool来管理使用。    在iobuf.h中定义了如下几个机构体:structiobuf是用来存储数据的内存块;structiobuf_arena是一个大内存块,切分成N个,每个小块给iobuf的ptr指针使用;... 查看详情

nodejs学习笔记---事件模块

目录简介及资料事件常用函数及使用emitter.on(event,listener)emitter.emit(event,[arg1],[arg2],[...])emitter.once(event,listener)emitter.removeListener(event,listener)emitter.removeAllListeners([event])emitter.listeners( 查看详情

backbone的event模块分析(代码片段)

nodejs有eventEmitter类,想到backbone 有个event模块可以对对象做事件绑定和触发,是backbone的核心模块。backboneevent模块on添加自定义事件off删除自定义事件trigger派发自定义事件once添加只执行一次的自定义事件(内部依赖... 查看详情

backbone的event模块分析(代码片段)

nodejs有eventEmitter类,想到backbone 有个event模块可以对对象做事件绑定和触发,是backbone的核心模块。backboneevent模块on添加自定义事件off删除自定义事件trigger派发自定义事件once添加只执行一次的自定义事件(内部依赖... 查看详情

backbone的event模块分析(代码片段)

nodejs有eventEmitter类,想到backbone 有个event模块可以对对象做事件绑定和触发,是backbone的核心模块。backboneevent模块on添加自定义事件off删除自定义事件trigger派发自定义事件once添加只执行一次的自定义事件(内部依赖... 查看详情

node概念笔记之eventemitter

1、产生事件分发的对象都是eventemitter的实例2、events模块只提供一个对象events.EventEmitter,核心就是事件触发和事件监听功能的封装引入方式  //引入events模块varevents=require(‘events‘);//创建eventEmitter对象vareventEmitter=newevents.EventEmit... 查看详情

如何使用kernel/perf_event*。[hc]分析框架?(代码片段)

...构以及如何使用它们?我可以假设它们总是存在并在内核模块中使用它们吗?我的内核模块在Cortex-A7或Cortex-A15内核上运行。在/arch/arm/kernel/目录下似乎有很多非常有用的东西,但是没有关于这些功能的文档?怎么会?答案Perf_even... 查看详情

activemq笔记:源码分析

...及BrokerService,TransportConnector和NetworkConnector等几个重要的模块的代码做一个简要的分析。启动过程如果要快速地了解系统的主要模块,最好的办法是熟悉该系统的启动过程。本文首先分析ActiveMQ的启动过程。 ActiveMQ可以作为一... 查看详情

minio源码分析(代码片段)

...章目录Bucket日志审计概要设计说明书参考1.MinIO事件通知模块的源码剖析1.事件通知模块`NotificationSys`2.`target.Target`3.`target.RedisTarget`4.`target.MySQLTarget`5.`target.KafkaTarget`6.`target.Store`7.事件类型`eve... 查看详情

锁,信号量,事件event模块(代码片段)

1.锁 Lock模块:保证一段代码,在同一时刻只能被一个进程执行.    lock=Lock()  创造了一把锁    acquire()    获取锁的钥匙    release()   归还这把锁的钥匙  ps:多进程的数据的不安全性:当多个进... 查看详情

vue.js源码学习笔记--分析前准备待续

主体  实例方法归类:    data  数据方法    dom  dom方法    event  事件处理    lifecycl 生命周期函数    init初始化vue页面  全局方法:    derectivesfilters init过程data:obser... 查看详情

《软件构架实践》阅读笔记三

...之间相互关联关系,使系统的物理分布显示的更加清晰。模块分解视图,软件的模块元素被称为计算机软件配置项,主要是讲的软件的一些配置模块,这些模块构成了可提交的文档和软件单元,标志着开发工作的进程,模块分解... 查看详情

nodejs--event模块,事件模块.

 1.注册事件on或者addListener,触发事件emit 1-1简单的使用:1varEventEmitter=require(‘events‘).EventEmitter;23varlife=newEventEmitter();45//求安慰:678functionwater(who){9console.log(‘给‘+who+‘倒水‘);10}11//具名函数12lif 查看详情

python数据分析入门--scipy库学习笔记(代码片段)

文章目录前言Scipy库简单入门1.cluster模块2.constants模块3.fftpack模块4.integrate模块5.interpolate模块6.linalg模块7.ndimage模块8.optimize模块9.stats模块10.ord模块总结前言scipy是一个python开源的数学计算库,可以应用于数学、科学以及工程领... 查看详情

[nodejs]核心模块--events

Events是Node中的一个很重要的核心模块,Stream,网络,文件系统统统都是继承自这个模块。Streams模块就是继承自EventEmitter,所以说弄明白Events模块,特别是EventEmitter对象,对于理解Node中的很多模块都是有好处的。Stream非常擅长处理... 查看详情

node的events模块

events可以说是node实现异步的基石,也是其他几个常用核心模块api的异步方法的原型。1vareventEmitter=require(‘events‘).EventEmitter;2//vareventEmitter=require(‘events‘);这样写也可以3varmyEvent=neweventEmitter();4myEvent.on(‘shout‘,function(){co 查看详情

仿百度糯米tp5项目笔记

需求分析系统三大模块商家平台、主平台、前台模块Thinkphp5.0实战 仿百度糯米开发多商家电商平台网盘下载(2017-04-2401:46:23)转载▼  第1章课程简介本章内容会给大家通览本门课程的所有知识点第2章需求分析本章会先带... 查看详情

事件相关笔记

点击label触发两次事件Event.preventDefault();//阻止默认事件Event.stopProgration();//阻止事件冒泡Event.stopImmediatePropagation();//阻止其他函数事件returnfalse;//组织默认事件和事件冒泡普通事件与事件绑定event.onclick=listener和event.addEventListener(ty 查看详情