最終更新:ID:55w90ThOAA 2009年04月17日(金) 21:48:08履歴
static int caml_page_table_modify(uintnat page, int toclear, int toset)
{ uintnat h; Assert ((page & ~Page_mask) == 0); /* Resize to keep load factor below 1/2 */
負荷率を1/2以下にするためにサイズを変更する。
if (caml_page_table.occupancy * 2 >= caml_page_table.size) {
if (caml_page_table_resize() != 0) return -1;
} h = Hash(Page(page));
while (1) { if (caml_page_table.entries[h] == 0) {
空のエントリが見つかった場合
caml_page_table.entries[h] = page | toset; caml_page_table.occupancy++; break; } if (Page_entry_matches(caml_page_table.entries[h], page)) {
既存のエントリが見つかった場合
caml_page_table.entries[h] = (caml_page_table.entries[h] & ~toclear) | toset; break; } h = (h + 1) & caml_page_table.mask;
空のエントリが見つからなかった場合は、リハッシュする。
} return 0; }
static int caml_page_table_modify(uintnat page, int toclear, int toset) { uintnat i = Pagetable_index1(page);
uintnat j = Pagetable_index2(page);
if (caml_page_table[i] == caml_page_table_empty) {
unsigned char * new_tbl = calloc(Pagetable2_size, 1);
if (new_tbl == 0) return -1; caml_page_table[i] = new_tbl; } caml_page_table[i][j] = (caml_page_table[i][j] & ~toclear) | toset; return 0; }
タグ
コメントをかく