ev_vars.h VAR(name, type name)以及VARx(type, name) 在ev.c文件中有 “VAR(name,decl) decl;”; 所以 VAR(name, type name)展开就是 type name; 即定义一个变量; VARx(type, name)展开就是 type name; 也是定义一个变量; ev.h EV_P, EV_P_, EV_A, EV_A_, EV_WATCHER*等 “#define EV_P_ EV_P,”展开就是 “struct ev_loop *loop,”, “#define EV_A_ EV_A,”展开就是 “loop,”, 而在libev中可以看见很多这样的函数 func(EV_P_ type arg1, type arg2), 把宏展开就是func(struct ev_loop *loop, arg1, arg2), 所以EV_P_的最大作用是作为函数的形参; 那么在调用函数时可以使用 func(EV_A_ arg1, arg2), 宏展开就是func(loop, arg1, arg2), 所以EV_A_的最大作用是作为函数的实参; EV_WATCHER(type)展开就是一系列的变量定义,在ev_watcher, ev_watcher_list等结构体中,就成了结构体成员变量了; 所以以上提到的宏,个人认为仅仅是为了方便,少写点代码!

read more


+ev++.h +ev.c +ev.h +event.c +event.h +ev_epool.c +ev_kqueue.c +ev_pool.c +ev_port.c +ev_select.c +ev_vars.h +ev_win32.c +ev_wrap.h 说明 ev++.h: c++的封装 ev.c ev.h 事件主循环实现 event.c event.h 事件定义实现 ev_epool.c/ev_pool.c/ev_kqueue.c/ev_port.h/ev_select.c IO复用封装 ev_vars.h 事件主循环结构体成员声明定义 ev_wrap.h 事件主循环结构体实例各成员简易宏定义 从最简单的说起ev_vars.h/ev_warp.h ev_vars.h内是一些列的VARx(type, name)以及VAR(name, type name) 在ev.c中有如下结构体 struct ev_loop { ev_tstamp ev_rt_now; #define ev_rt_now ((loop)->ev_rt_now) #define VAR(name, decl) decl; #include "ev_vars.h" #undef VAR }; #include "ev_wrap.h" VARx(ev_tstamp, now_floor)展开就是 ev_tstamp now_floor;就是定义了一个名为now_floor类型为ev_tstamp的变量; VAR(pendings, ANPENDING *pendings[NUMPRI])展开就是ANPENDING *pendings[NUMPRI];就是定义了一个名为pendings的ANPENDING指针数组; 所以在vars.h中的就是一些列的结构体成员变量的定义 ev_wrap.h 其中#define acquire_cb ((loop)->acquire_cb), loop是struct ev_loop的实例,所以ev_wrap.h中的所有宏定义都是为了方便才定义的,ev_wrap.h和ev_vars.h是可以对应上。 由此可见ev_vars.h和ev_wrap.h并不在libev的架构之中,这两个文件的存在仅仅是为了方便!!!

read more


1: #undef offset 2: #define offset(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) 3: 4: #define container_of(ptr, type, member) ({ \ 5: const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 6: (type *)( (char *) __mptr - offsetof(type, member) );}) 7: 8: struct list_head{ 9: struct list_head *next, *prev; 10: }; 11: 12: #define LIST_HEAD_INIT(name) { &(name), &(name) } 13: #define LIST_HEAD(name) \ 14: struct list_head name = LIST_HEAD_INIT(name) 15: 16: static inline void INIT_LIST_HEAD(struct list_head *list) 17: { 18: list->next = list; 19: list->prev = list; 20: } 21: 22: static inline void __list_add(struct list_head *new, 23: struct list_head *prev, 24: struct...

read more


首先直接上代码 from multiprocessing import Pool, Manager, Queue from time import sleep def fun(num, queue) : print "hello %d" % num return def main() : pool = Pool(processes=4) q = Queue() for k in range(5) : pool.apply_async(fun, args=(k, q)) pool.close() pool.join() return if __name__ == '__main__' : main() 本想把Queue实例作为参数传到进程中,可是没有得到想要的结果 在笔者的环境中没有报错,但是结果不是预期的 也可能报错 RuntimeError: Queue objects should only be shared between process through inheritance. 解决 把multiprocessing.Queue()换成multiprocessing.Manager().Queue()

read more


当制作网无情的查封了我的炉台, 当灰烬的余烟叹息着贫困的悲哀, 我依然固执地铺平失望的泪水, 用美丽的雪花写下:相信未来。 当我的紫葡萄化为深秋的露水, 当我的鲜花依偎在别人的情怀, 我依然固执地用凝霜的枯藤, 在凄凉的大地上写下:相信未来。 我要用手指那涌向天边的排浪, 我要用手撑那托起太阳的大海, 摇曳着曙光那支漂亮的笔杆, 用孩子的笔体写下: 相信未来。 我之所以坚定的相信未来, 是我相信未来人们的眼睛 —— 她有拨开历史风尘的睫毛, 她有看透岁月篇章的瞳孔, 不管人们对于我们腐烂的皮肉, 那些迷途的惆怅,失败的痛苦, 是寄予感动的热泪,深切的同情, 还是给以轻蔑的微笑,辛辣的嘲讽。 我坚信人们对于我们的脊骨, 那无数次地探索、迷途、失败和成功, 一定会给予热情、客观、公正的评定, 是的,我焦急地等待着他们的评定。 朋友,坚定地相信未来吧, 相信不屈不挠的努力, 相信战胜死亡的年轻, 相信未来,热爱生命。

read more