libev 宏展开

想看源码,宏太多,看着累,宏展开,再看,功力时间不够,先放下

放上宏展开后的代码。

libev4.20

展开方示为

./configure

修改makefile文件,字符串 替换CC为 CPP

注意要把基础的CC定义保留

make

mv ev.o ev.c

mv event.o event.c

make clean

 

修改makefile文件,字符串替换CPP-》CC

注意要把基础的CPP定义保留 

 

宏展开后#号注释的代码,可以修改CPP的定义 加个参数 

 

ev.c,event.c

及为展开后的代码

测试可编译通过

附ev.c部分代码

struct ev_loop;
enum {EV_UNDEF = (int)0xFFFFFFFF,EV_NONE = 0x00,EV_READ = 0x01,EV_WRITE = 0x02,EV__IOFDSET = 0x80,EV_IO = EV_READ,EV_TIMER = 0x00000100,EV_TIMEOUT = EV_TIMER,EV_PERIODIC = 0x00000200,EV_SIGNAL = 0x00000400,EV_CHILD = 0x00000800,EV_STAT = 0x00001000,EV_IDLE = 0x00002000,EV_PREPARE = 0x00004000,EV_CHECK = 0x00008000,EV_EMBED = 0x00010000,EV_FORK = 0x00020000,EV_CLEANUP = 0x00040000,EV_ASYNC = 0x00080000,EV_CUSTOM = 0x01000000,EV_ERROR = (int)0x80000000
};
typedef struct ev_watcher
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_watcher *w, int revents);
} ev_watcher;typedef struct ev_watcher_list
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_watcher_list *w, int revents);struct ev_watcher_list *next;
} ev_watcher_list;typedef struct ev_watcher_time
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_watcher_time *w, int revents);ev_tstamp at;
} ev_watcher_time;typedef struct ev_io
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_io *w, int revents);struct ev_watcher_list *next;int fd;int events;
} ev_io;typedef struct ev_timer
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_timer *w, int revents);ev_tstamp at;ev_tstamp repeat;
} ev_timer;typedef struct ev_periodic
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_periodic *w, int revents); ev_tstamp at;ev_tstamp offset;ev_tstamp interval;ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) ;
} ev_periodic;typedef struct ev_signal
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_signal *w, int revents);struct ev_watcher_list *next;int signum;
} ev_signal;typedef struct ev_child
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_child *w, int revents);struct ev_watcher_list *next;int flags;int pid;int rpid;int rstatus;
} ev_child;typedef struct stat ev_statdata;typedef struct ev_stat
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_stat *w, int revents);struct ev_watcher_list *next;ev_timer timer;ev_tstamp interval;const char *path;ev_statdata prev;ev_statdata attr;int wd;
} ev_stat;typedef struct ev_idle
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_idle *w, int revents);
} ev_idle;typedef struct ev_prepare
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_prepare *w, int revents);
} ev_prepare;typedef struct ev_check
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_check *w, int revents);
} ev_check;typedef struct ev_fork
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_fork *w, int revents);
} ev_fork;typedef struct ev_cleanup
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_cleanup *w, int revents);
} ev_cleanup;typedef struct ev_embed
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_embed *w, int revents);struct ev_loop *other;ev_io io;ev_prepare prepare;ev_check check;ev_timer timer;ev_periodic periodic;ev_idle idle;ev_fork fork;ev_cleanup cleanup;} ev_embed;typedef struct ev_async
{int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_async *w, int revents);sig_atomic_t volatile sent;
} ev_async;union ev_any_watcher
{struct ev_watcher w;struct ev_watcher_list wl;struct ev_io io;struct ev_timer timer;struct ev_periodic periodic;struct ev_signal signal;struct ev_child child;struct ev_stat stat;struct ev_idle idle;struct ev_prepare prepare;struct ev_check check;struct ev_fork fork;struct ev_cleanup cleanup;struct ev_embed embed;struct ev_async async;};enum {EVFLAG_AUTO = 0x00000000U,EVFLAG_NOENV = 0x01000000U,EVFLAG_FORKCHECK = 0x02000000U,EVFLAG_NOINOTIFY = 0x00100000U,EVFLAG_NOSIGFD = 0,EVFLAG_SIGNALFD = 0x00200000U,EVFLAG_NOSIGMASK = 0x00400000U
};enum {EVBACKEND_SELECT = 0x00000001U,EVBACKEND_POLL = 0x00000002U,EVBACKEND_EPOLL = 0x00000004U,EVBACKEND_KQUEUE = 0x00000008U,EVBACKEND_DEVPOLL = 0x00000010U,EVBACKEND_PORT = 0x00000020U,EVBACKEND_ALL = 0x0000003FU,EVBACKEND_MASK = 0x0000FFFFU
};extern int ev_version_major (void) ;
extern int ev_version_minor (void) ;extern unsigned int ev_supported_backends (void) ;
extern unsigned int ev_recommended_backends (void) ;
extern unsigned int ev_embeddable_backends (void) ;extern ev_tstamp ev_time (void) ;
extern void ev_sleep (ev_tstamp delay) ;extern void ev_set_allocator (void *(*cb)(void *ptr, long size) ) ;extern void ev_set_syserr_cb (void (*cb)(const char *msg) ) ;extern struct ev_loop *ev_default_loop (unsigned int flags ) ;static inline struct ev_loop *
ev_default_loop_uc_ (void)
{extern struct ev_loop *ev_default_loop_ptr;return ev_default_loop_ptr;
}static inline int
ev_is_default_loop (struct ev_loop *loop)
{return loop == ev_default_loop_uc_ ();
}extern struct ev_loop *ev_loop_new (unsigned int flags ) ;static inline void
idle_reify (struct ev_loop *loop)
{if (__builtin_expect ((!!(((loop)->idleall))),(0))){int pri;for (pri = ((((0x7f) & 4) ? +2 : 0) - (((0x7f) & 4) ? -2 : 0) + 1); pri--; ){if (((loop)->pendingcnt) [pri])break;if (((loop)->idlecnt) [pri]){queue_events (loop, (W *)((loop)->idles) [pri], ((loop)->idlecnt) [pri], EV_IDLE);break;}}}
}static inline void
timers_reify (struct ev_loop *loop)
{do { } while (0);if (((loop)->timercnt) && (((loop)->timers) [(4 - 1)]).at < ((loop)->mn_now)){do{ev_timer *w = (ev_timer *)(((loop)->timers) [(4 - 1)]).w;if (w->repeat){((WT)(w))->at += w->repeat;if (((WT)(w))->at < ((loop)->mn_now))((WT)(w))->at = ((loop)->mn_now);(__builtin_expect(!(("libev: negative ev_timer repeat value found while processing timers", w->repeat > 0.)), 0) ? __assert_rtn(__func__, "ev.c", 3207, "(\"libev: negative ev_timer repeat value found while processing timers\", w->repeat > 0.)") : (void)0);(((loop)->timers) [(4 - 1)]).at = (((loop)->timers) [(4 - 1)]).w->at;downheap (((loop)->timers), ((loop)->timercnt), (4 - 1));}elseev_timer_stop (loop, w);do { } while (0);feed_reverse (loop, (W)w);}while (((loop)->timercnt) && (((loop)->timers) [(4 - 1)]).at < ((loop)->mn_now));feed_reverse_done (loop, EV_TIMER);}
}static void __attribute__ ((__noinline__))
periodic_recalc (struct ev_loop *loop, ev_periodic *w)
{ev_tstamp interval = w->interval > 0.0001220703125 ? w->interval : 0.0001220703125;ev_tstamp at = w->offset + interval * floor ((((loop)->ev_rt_now) - w->offset) / interval);while (at <= ((loop)->ev_rt_now)){ev_tstamp nat = at + w->interval;if (__builtin_expect ((!!(nat == at)),(0))){at = ((loop)->ev_rt_now);break;}at = nat;}((WT)(w))->at = at;
}static inline void
periodics_reify (struct ev_loop *loop)
{do { } while (0);while (((loop)->periodiccnt) && (((loop)->periodics) [(4 - 1)]).at < ((loop)->ev_rt_now)){do{ev_periodic *w = (ev_periodic *)(((loop)->periodics) [(4 - 1)]).w;if (w->reschedule_cb){((WT)(w))->at = w->reschedule_cb (w, ((loop)->ev_rt_now));(__builtin_expect(!(("libev: ev_periodic reschedule callback returned time in the past", ((WT)(w))->at >= ((loop)->ev_rt_now))), 0) ? __assert_rtn(__func__, "ev.c", 3269, "(\"libev: ev_periodic reschedule callback returned time in the past\", ev_at (w) >= ev_rt_now)") : (void)0);(((loop)->periodics) [(4 - 1)]).at = (((loop)->periodics) [(4 - 1)]).w->at;downheap (((loop)->periodics), ((loop)->periodiccnt), (4 - 1));}else if (w->interval){periodic_recalc (loop, w);(((loop)->periodics) [(4 - 1)]).at = (((loop)->periodics) [(4 - 1)]).w->at;downheap (((loop)->periodics), ((loop)->periodiccnt), (4 - 1));}elseev_periodic_stop (loop, w);do { } while (0);feed_reverse (loop, (W)w);}while (((loop)->periodiccnt) && (((loop)->periodics) [(4 - 1)]).at < ((loop)->ev_rt_now));feed_reverse_done (loop, EV_PERIODIC);}
}static void __attribute__ ((__noinline__))
periodics_reschedule (struct ev_loop *loop)
{int i;for (i = (4 - 1); i < ((loop)->periodiccnt) + (4 - 1); ++i){ev_periodic *w = (ev_periodic *)(((loop)->periodics) [i]).w;if (w->reschedule_cb)((WT)(w))->at = w->reschedule_cb (w, ((loop)->ev_rt_now));else if (w->interval)periodic_recalc (loop, w);(((loop)->periodics) [i]).at = (((loop)->periodics) [i]).w->at;}reheap (((loop)->periodics), ((loop)->periodiccnt));
}static void __attribute__ ((__noinline__))
timers_reschedule (struct ev_loop *loop, ev_tstamp adjust)
{int i;for (i = 0; i < ((loop)->timercnt); ++i){ANHE *he = ((loop)->timers) + i + (4 - 1);(*he).w->at += adjust;(*he).at = (*he).w->at;}
}static inline void
time_update (struct ev_loop *loop, ev_tstamp max_block)
{{((loop)->ev_rt_now) = ev_time ();if (__builtin_expect ((!!(((loop)->mn_now) > ((loop)->ev_rt_now) || ((loop)->ev_rt_now) > ((loop)->mn_now) + max_block + 1.)),(0))){timers_reschedule (loop, ((loop)->ev_rt_now) - ((loop)->mn_now));periodics_reschedule (loop);}((loop)->mn_now) = ((loop)->ev_rt_now);}
}
View Code

还没看,以后可能也不会看了

转载于:https://www.cnblogs.com/zihunqingxin/p/5027350.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS高级篇7---FreeRTOS内存管理分析

原文&#xff1a;http://blog.csdn.net/zhzht19861011/article/details/51606068 内存管理对应用程序和操作系统来说都非常重要。现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关。 FreeRTOS操作系统将内核与内存管理分开实现&#xff0c;操作系统内核仅规定了必要的内…

笔试题

1.是不是一个父类写了一个virtual 函数&#xff0c;如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。private 也被集成&#xff0c;只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存…

FreeRTOS学习笔记——互斥型信号量

来自&#xff1a;http://blog.csdn.net/xukai871105/article/details/43456985 0.前言 在嵌入式操作系统中互斥型信号量是任务间资源保护的重要手段。下面结合一个具体例子说明FreeRTOS中的互斥型信号量如何使用。 【相关博文】 【FreeRTOS STM32移植笔记】 【FreeRTOS学习笔记…

JSP动态网站环境搭建应用中的详细步骤(Tomcat和Apache/IIS的整合)

链接地址&#xff1a;http://www.cnblogs.com/dartagnan/archive/2011/03/25/2003426.html JSP动态网站环境搭建应用中的详细步骤(Tomcat和Apache/IIS的整合)sun推出的JSP&#xff08;Java Server Pages&#xff09;是一种执行于服务器端的动态网页开发技术&#xff0c;它基于J…

关于JS获取select值的两种实现方法

前几天发了一篇关于javascript获取select值的方法&#xff0c;后来发现有另一种实现方法&#xff0c;所以就都发出来比较一下&#xff1a; 方法一&#xff1a;通过获取option标签的value值来确定&#xff1a; <!DOCTYPE html> <html> <head><meta charset…

c语言题库1

1. 用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09; #define time (365*24*60*60) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365) 2. 写一个“标准”宏MIN&#xff0c;这个宏输入两个参数并返回较小的一个。 #di…

FreeRTOS系列第19篇---FreeRTOS信号量

来自&#xff1a;http://blog.csdn.net/zhzht19861011/article/details/50835613 本文介绍信号量的基础知识&#xff0c;详细源码分析见《FreeRTOS高级篇6---FreeRTOS信号量分析》 1.信号量简介 FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量&#xff08;以后简称…

mysql语法替换字符串

UPDATE ht_business_task SET url REPLACE ( url, &amp;, & )转载于:https://www.cnblogs.com/lz20150121/p/5030739.html

POJ1274 The Perfect Stall(二分图)

题意&#xff1a; 一些奶牛只有在特定的围栏中才能产奶&#xff0c;要求合理安排使能产奶的奶牛数达到最大。 要点&#xff1a; 二分图裸题&#xff0c;最近刚学了二分图&#xff0c;看下面的参考博客&#xff0c;写的比较好&#xff1a; 参考博客&#xff1a;匈牙利算法 15479…

蓝牙HCI剖析(一)

来自&#xff1a;http://blog.csdn.net/xiaoxiaopengbo/article/details/51334257 一.HCI介绍 HCI提供了访问bluetooth control的统一接口&#xff0c;通俗来讲&#xff0c;就是定义了特定的格式来控制蓝牙芯片来做相应的动作&#xff08;比如inquiry,connect,disconnect&#…

c语言题库2

96. struct name1{ char str; short x; int num; } struct name2{ char str;0 1 2 3 int num; 4 5 6 7 short x; 8 9 10 11 } sizeof(struct name1)? sizeof(struct name2)? 8、12 97. 读文件file1.txt的内容&#xff08;例如&#xff09;&#xff1a; 12 34 56 …

ASP.NET状缓存Cache的应用-提高数据库读取速度

ASP.NET状缓存Cache的应用-提高数据库读取速度 原文:ASP.NET状缓存Cache的应用-提高数据库读取速度一、 Cache概述 既然缓存中的数据其实是来自数据库的&#xff0c;那么缓存中的数据如何和数据库进行同步呢&#xff1f;一般来说&#xff0c;缓存中应该存放改动不大或者对…

2016年学习Linux决心书(老男孩教育在线课程班第二期)

我经过这4-5个月的学习后&#xff0c;我一定要达到月薪20&#xff2b;&#xff0c;为了达到这个目标我要付出如下10大行动&#xff1a;1.提前预习上课内容2.上课认真听讲&#xff0c;做好上课笔记3.课后认真做总结&#xff0c;完善笔记5.反复做实验&#xff0c;并写实验文档6.学…

WPF XAML 从零开始认识XAML

来自&#xff1a;http://blog.csdn.net/aoshilang2249/article/details/44158403 剖析最简单的XMAL代码: [html] view plaincopy <Window x:Class"MyFirstApplication.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentati…

c语言题库3

143. 枚举元素本身由系统定义了一个表示序号的数值&#xff0c;从0 开始顺序定义为0&#xff0c;1&#xff0c;2…。如在weekday中&#xff0c;sun值为0&#xff0c;mon值为1&#xff0c; …,sat值为6。 main(){  enum weekday  {   sun,mon,tue,wed,thu,fri,sat  } a,b…

入门级----测试的执行、环境的搭建、每日构建、测试记录和跟踪、回归测试、测试总结和报告...

测试用例的准备&#xff0c;都是为了执行测试准备的。 测试环境的搭建 &#xff08;1&#xff09;测试数据&#xff1a;有些测试需要使用大批量的数据&#xff0c;例如容量测试、压力测试等。根据产品的具体测试要求&#xff0c;可能需要在数据库表插入大量的数据&#xff0c;准…

MFC读取配置文件GetPrivateProfileString

VC中 3 个主要 写入/读取配置文件ini的函数&#xff1a;bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);写入.ini文件&#xff1b;DWORDGetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpD…

UESTC 250 windy数 数位dp

题目链接 1 #include<bits/stdc.h>2 using namespace std;3 #define mem1(a) memset(a, -1, sizeof(a))4 #define ll long long5 int dp[20][20], digit[20], len;6 ll dfs(int len, int pre, bool fp, bool first) { //first表示前面的数是否全部为0&#xff0c; pr…

c语言面试题大全

C语言面试题大汇总 4. static有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1.限制变量的作用域(DL:使其只在定义的当前文件中起作用&#xff0c;static是只能由与变量在同一个文件中定义的程序存取的全局变量。也就是说使全局变量成为文件的私有变量&#…

WindowsAPI详解——GetCurrentDirectory 获得程序当前目录

每个Windows程序都有一个自己的当前目录&#xff0c;默认是程序exe文件所在的目录。系统在给程序加载动态链接库文件(DLL)时先在程序当前目录里查找要加载的DLL&#xff0c;如果在此目录下没有找到系统便会去Windows目录下查找。在这儿我们主要将如何获得程序的当前目录&#x…