阅读postgresql

反正我就是喜欢freebsd/berkeleyDB/postgresql,大概是因为它们共同的血脉以及BSD方式的授权。

前几天下了postgresql的代码,本来准备用vc编译,然后发现要装perl,而且必须是windows版的active perl而不能是cygwin perl,而且PATH中不能有cygwin的东西,并且还有很多很多需求,于是我放弃了。我在vc下用别人预编译好的库写应用,唯一的担心就是crt版本的问题,我用的是多线程调试DLL,而它不知道当时是和什么链接的,而且那个是vc71的库,而我用的是vc9。

尽管postgresql不建议使用cygwin编译运行,但是我不想装mingw之类的,就还是这么弄了。configure/make/make install一切顺利。但是运行的时候有特殊要求,必须事先启动cygserver,然后将环境变量CYGWIN设置成server,否则启动会报bad system call(在请求SystemV shared memory的时候)。

可是我不想再用emacs写代码了,我喜欢eclipse。eclipse中编译调试都很方便。但是我不知道为什么我在启动的时候,就会在ntdll.dll中连续停下来几次,而显然我没有对应的源文件用来加断点,我怀疑是遇到signal了,但是我在eclipse/cdt中没有找到与signal相关的设置。更郁闷的是,尽管eclipse在调试程序的启动参数中支持设置环境变量,但是这个环境变量是windows的环境变量而不是cygwin的shell的环境变量。我在这里尝试设置了CYGWIN这个环境变量,但是在程序中用getenv(“CYGWIN”)得到的却是NULL。不晓得该怎么办,于是总是启动失败。

之所以选择postgresql的代码来读,是因为我觉得它的注释写的很详尽。代码风格很普通工整,而在每个函数开头都详细的描述了用途,在每个特殊实现的地方都详细说明了为什么这么做。但是,随便扫了几眼,就发现一些我觉得不够好的地方,例如:

1892: if (cvc)
1893: free(cvc);

前面那个if判断完全是不必要的。

还有这样的:

postmaster.c
817:for (i = 0; i \< MAXLISTEN; i++)
818: ListenSocket[i] = -1;

为什么非要手写一个loop而不是用memset呢?那样会更简洁,并且,或许这个系统的libc库的memset是用汇编以更高效的串移位指令实现的呢。

另外,这个开发社区反对使用一切bug管理工具,这帮狂野的人认为,邮件列表是更有效的沟通方式。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥