delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

25 Feb 2009

为什么FreeBSD没有CIRCLEQ_*

最近在看 Berkeley DB,发现一套 FreeBSD 上没有的宏, CIRCLEQ_*。

看了一下,这组宏是来自 4.4BSD 的,因此 FreeBSD 曾经有过这个宏;后来, phk 在 2000 年 12 月 29 日从 FreeBSD 里面把它拿掉了(SVN revision 70469),当时的说明如下:

CIRCLEQs are a disgrace to everything Knuth taught us in Volume 1 Chapter 2.

Retire them before anybody starts to use them again.

Use TAILQ instead, it provides the same functionality.

这个说的并不是很明确。查了一下,果然当时引起过争议(反对的意见主要是认为这会导致无法从 NetBSD 和 OpenBSD 移植代码,而另一方面,这被认为是 4.4BSD API 的一部分)。

Kirk McKusick(queue.h的作者)随后表示 支持 这一变动。具体的原因是 CIRCLEQ 的所有的功能,都可以用 TAILQ 以更高效的方式实现(因为 TAILQ 产生的 比较 操作更少)。

在移植代码时,只需简单地将 CIRCLEQ 替换为 TAILQ 即可。需要注意的是,如果代码中有绕过宏进行的操作,则需要进行相应的变动。