読者です 読者をやめる 読者になる 読者になる

obmalloc.cのusedpoolsが凄い

CPythonのソースコードのobmalloc.cにusedpoolsがあるんだけど,これが色々凄い.

# Python-3.0.1/Objects/obmalloc.c:234
/* Pool for small blocks. */
struct pool_header {
	union { block *_padding;
		uint count; } ref;	/* number of allocated blocks    */
	block *freeblock;		/* pool's free list head         */
	struct pool_header *nextpool;	/* next pool of this size class  */
	struct pool_header *prevpool;	/* previous pool       ""        */
	uint arenaindex;		/* index into arenas of base adr */
	uint szidx;			/* block size class index	 */
	uint nextoffset;		/* bytes to virgin block	 */
	uint maxnextoffset;		/* largest valid nextoffset	 */
};

typedef struct pool_header *poolp;

# Python-3.0.1/Objects/obmalloc.c:409
#define PTA(x)	((poolp )((uchar *)&(usedpools[2*(x)]) - 2*sizeof(block *)))
#define PT(x)	PTA(x), PTA(x)

static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] = {
	PT(0), PT(1), PT(2), PT(3), PT(4), PT(5), PT(6), PT(7)

  /* 省略 */
};

 
pool_headerをプールするための変数なんだけど,これが何かパズルみたいになってる.
 
usedpoolsはこんな感じで使う.

    pool = usedpools[1 + 1];
    pool->nextpool
    pool->prevpool

これを図にすると….

と,こうなる.
 
つまり,

    pool = usedpools[1 + 1];
    /* pool == pool->nextpool == pool->prevpool */

ということで,よくわかりません.
 
まぁ,この状態にあるのは初期状態だけで,mallocするにしたがって次第に変わるんだけど.
何でこんな複雑な構造にしてしまったのか….
 
と思ったらコメントで,

It's unclear why the usedpools setup is so convoluted.
意訳:usedpoolsセットアップがなぜそれほど複雑かは、不明です。

うへ.