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