swapリストでのCのお勉強
Rev.2を表示中。最新版はこちら。
swapon関数内でスワップ領域のプライオリティに応じ、そのリストを作成する箇所である。pが新規にリストにつなごうとするswap_infoで、swap_info[]がそれぞれのスワップ領域を表している。swap_list_t構造対はheadとnextの2つのメンバーをもつ構造体で、swap_info[]リストのヘッドとなる。初期値は-1,-1である。
static struct swap_list_t swap_list = {-1, -1};
static struct swap_info_struct swap_info[MAX_SWAPFILES];
/* insert swap space into swap_list: */
prev = -1;
for (i = swap_list.head; i >= 0; i = swap_info[i].next) {
if (p->prio >= swap_info[i].prio) {
break;
}
prev = i;
}
p->next = i;
if (prev < 0) {
swap_list.head = swap_list.next = p - swap_info;
} else {
swap_info[prev].next = p - swap_info;
}
初めてスワップを登録するとき、swap_list の初期値が-1であることとi >= 0条件で、forループはスキップする。従ってprev = -1で、swap_list.headとswap_list.nextにはp - swap_infoが設定される。2回目以降はforループでチェックされ、pより小さいプライオリティのswap_infoがあると、そこでループを抜ける。そして直前のpより大きいプライオリティのswap_infoはprevに設定されており、そのswap_info.nextにp - swap_infoを設定し、p->nextにpより次に小さいプライオリティの位置となるiを設定することでリストを作成している。このリストはswap_info[]内の配列インデックスで構成していることになるのだが。で・・・・
p - swap_infoは配列インデックスを算出するわけである。実はアドレスpからアドレスswap_infoまでの差とばっかし思い込んでいたため、ここの理解に悩んでしまった。
struct test {
int dummy1;
int dummy2;
};
struct test a[10];
main()
{
struct test *p;
p = a;
p++;
p++;
printf("%d\n", a);
printf("%d\n", p);
printf("%d\n", p - a);
}
結果は以下の通りであった。[root@KURO-BOXHG kitamura]# ./a.out 268503276 268503292 2






