摘要: 1.Closure: NewCallBack生成的Closure在回调完后会执行自我删除,NewPermanentCallback则不会。protobuf源码片段:文件src/google/protobuf/stubs/common.h2. Message的序列化和反序列化string类型: Message有一些API SerializeToString,ParseFromString,接受C++ string类型做参数,有些人认为Message Encode成的二进制数据会有0字节,string会不会截断呢?其实不会,string是可以保存中间有'\0'的字符串,但是不能用s 阅读全文
posted @ 2013-02-25 22:36 persistentsnail 阅读(914) 评论(0) 推荐(0) 编辑
摘要: libevent的evbuffer之减少内存拷贝 evbuffer是块状数组的数据结构,既是一块块连续的内存链接起来的,evbuffer有许多有用的接口,这里只想对可以减少内存拷贝的接口做详细记录。 1.int evbuffer_reserve_space(struct evbuffer *buf, ev_ssize_t size, struct evbuffer_iovec *vec, int n_vecs); int evbuffer_commit_space(struct evbuffer *buf, struct evbuffer_iovec *vec, int n_vecs); .. 阅读全文
posted @ 2012-11-10 23:35 persistentsnail 阅读(2121) 评论(0) 推荐(0) 编辑
摘要: libevent的bufferevent libevent的bufferevent是在event的基础上自己维护了一个buffer,这意味着你的程序不再需要自己管理一个buffer。而且在windows上的异步IO不是“select()-like"接口,而是IOCP API,在一个socket已经准备好读写时并不会通知你的程序去从内核复制到用户内存(或者从内核复制到内核),而是在将数据从内核已经复制到用户内存(或反之)再通知你的程序。bufferevent API的使用刚好能满足这种情况,或者说在不支持IOCP的linux上能够模拟出这种功能。看下bufferevent的基本用法: 阅读全文
posted @ 2012-11-10 00:12 persistentsnail 阅读(1069) 评论(0) 推荐(0) 编辑
摘要: LUA并不支持直接访问C++的类,但是通过使用LUA的C API和C++ templates,可以在LUA注册C++类,并访问其成员,这种方法叫做Luna。 LunaWrapper是一个简单的Luna实现,它的具体做法可概括为如下:1.初始化LunaWrapper时调用其注册函数Register,在Register中通过LUA C API把一个C函数定义为一个全局LUA函数,函数名是LUA中要访问的C++ class类名,以便能在lua中这样创建C++对象:foo = Foo()。这个C函数其实主要是new一个Foo对象出来,关于这个C函数具体实现见下文。在Register中还创建... 阅读全文
posted @ 2012-09-03 23:37 persistentsnail 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 拿到lighttpd的源码就迫不及待的想去掉繁杂的皮肉以窥其简单的网络模型框架。我们平常所写的TCP网络服务程序离不开这样的步骤:新建socket ——》将socket绑定到某个地址——》侦听客户端连接——》accept获取已连接socket——》读写已连接socket。Lighttpd不外如此。 lighttpd使用的是TCP预先派生子进程,每一个子进程各自accept的服务器设计范式,或者叫watcher-worker模型,关于各种网络程序设计范式在unix网络编程一书中有详细描述。整个程序的入口函数在server.c文件中,在main函数开始部分是各种繁杂的初始化工作,现在暂且略过,直接 阅读全文
posted @ 2012-05-27 18:09 persistentsnail 阅读(1028) 评论(0) 推荐(1) 编辑
摘要: 这段时间遇到了两个字节对其相关的bug,折腾了我许久。原因主要有两点:1.程序崩在最不可能的地方,调试的时候即便调到汇编级的,指针前一个指令值还是正确的,ret后却错了,且这段代码从来不被认为会出错。2.在一个庞大的工程中,头文件引用错综复杂,很难寻找到是哪个地方设置了不正确的字节对齐方式。 引起字节对齐错误的原因却很简单,比如一个结构体定义在一个头文件中,被模块A按转4节齐对齐编译,又被模块B按照1字节对齐编译,该结构体指针在A,B模块之间传递,引用成员时因为成员地址不同,导致程序崩溃。例如:#pragma pack(4)struct _Test{ ... 阅读全文
posted @ 2012-05-19 19:16 persistentsnail 阅读(2097) 评论(0) 推荐(0) 编辑
摘要: 背景前不久在调试一个与导出符号相关的bug,问题大概如此:模块A.so在堆上构造了一个对象即CTest*one=newCTest;,CTest在A.so定义,后来使用one->AMemFunc();,即调用一个成员函数时崩溃。原来在另一个模块B.so(比A.so先加载)中,也有一个同名的CTest定义,但是却没有一个叫AMemFunc的成员函数,因此崩溃。那为什么A.so的CTest会被解析到B.so呢?全局符号介入这种一个共享对象里面的全局符号被另一个共享对象的同名全局符号覆盖的现象又被称为共享对象全局符号介入(GlobalSymbolInterpose)。对于全局符号介入这个问题,l 阅读全文
posted @ 2012-05-19 11:21 persistentsnail 阅读(2794) 评论(0) 推荐(0) 编辑
摘要: 笔记本使用ubuntu散热量很大,于是想禁掉独显,机器是双显卡,独显是ATI5650,在BIOS只有两种选择,要么只用独显,要么使用显卡可切换模式。似乎ubuntu10.10已经支持显卡可切换模式。选择可切换模式。谷歌了下,大致是要找到这个文件/sys/kernel/debug/vgaswitcheroo/switch。如果没有这个文件,是因为你装了ATI驱动,卸载掉,再重启即可,下面是如何卸载ATI驱动:sudosh/usr/share/ati/fglrx-uninstall.sh如果说没有此文件则执行:sudoapt-getremove--purgefglrxfglrx_*fglrx-am 阅读全文
posted @ 2012-05-14 13:46 persistentsnail 阅读(859) 评论(0) 推荐(0) 编辑
摘要: Ubuntu升级到了12.04,GCC也升级到了4.6.3,重新编译项目工程时发现许多以前的警告变成了错误,仔细一看代码都是在取C++的临时变量地址做参数出错,以前为了方便很多这样的代码两种改法:1.改代码,显示定义一个临时变量,再取地址;2.加fpermissive做编译参数。前者工作量大,后者可能会忽略其他编译错误,不可取。于是想到自己编一个GCC4.5.2版本,构建此项目时用老版本,其他则用新版本。谷歌了下,下面是在ubuntu12.0464位上构建GCC的完整过程,摘自http://www.oschina.net/question/12_49423,注意:1.32位系统请将LIBRAR 阅读全文
posted @ 2012-05-14 12:34 persistentsnail 阅读(981) 评论(0) 推荐(0) 编辑
摘要: 概述线程池主要有两种实现模型:半同步/半异步模型:一个线程(ManagerThread)在工作队列上侦听,一旦主线程往工作队列push新的工作任务,ManagerThread拿出这个任务分派给某个空闲的工作线程去执行。在这个过程中ManagerThread负责任务调度,真正做事的是WorkerThread。异步指对任务请求是异步的,同步指分派处理任务过程中需要做同步操作。领导者/跟随者模型:有一个线程起初是leader,其他的线程是followers,当有任务请求到达时,leader接下这个任务处理,同时从followers中选择一个新的leader,这个过程中始终只有一个leader线程在侦 阅读全文
posted @ 2012-05-14 11:33 persistentsnail 阅读(271) 评论(0) 推荐(0) 编辑