Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/memory/MemHash.cpp @ 383:25c820b6060e
fix header, MemHash in kernel
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 06 Aug 2009 12:04:55 +0900 |
parents | TaskManager/Test/test_render/spe/TileHash.cpp@b4b8345b5366 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/memory/MemHash.cpp Thu Aug 06 12:04:55 2009 +0900 @@ -0,0 +1,90 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "MemHash.h" + +static unsigned short PRIME[8] = { + 0x002, 0x065, 0x0c7, 0x133, 0x191, 0x1f3, 0x259, 0x2bd, +}; + +int +MemHash::hash(memaddr data) +{ + int value = 0; + int n = 0; + int key; + + for (uint32 i = 0; i < sizeof(memaddr) * 2; i ++) { + key = data & 0xf; + value += key * PRIME[n++ & 7]; + data >>= 4; + } + + return value % hashSize; +} + +MemHash::MemHash(void) +{ + //hashSize = 263; + //tableSize = sizeof(MemorySegmentPtr)*hashSize; + + table = (MemorySegmentPtr*)malloc(tableSize); + clear(); +} + +int +MemHash::put(memaddr key, MemorySegmentPtr data) +{ + int hashval = hash(key); + + for (int i = 0; i < hashSize/2; i++) { + int index = (hashval + i*i)%hashSize; + + if (table[index] == 0) { // 空の table に入れる + table[index] = data; + return index; + } + } + + return -1; +} + +MemorySegmentPtr +MemHash::get(memaddr key) +{ + int hashval = hash(key); + + for (int i = 0; i < hashSize/2; i++) { + int index = (hashval + i*i)%hashSize; + + if (table[index] != NULL && + table[index]->address == key) { + return table[index]; + } + } + + return NULL; +} + +void +MemHash::remove(memaddr key) +{ + int hashval = hash(key); + + for (int i = 0; i < hashSize/2; i++) { + int index = (hashval + i*i)%hashSize; + + if (table[index] != NULL && + table[index]->address == key) { + table[index] = NULL; + } + } +} + +void +MemHash::clear(void) +{ + bzero(table, tableSize); +} + +/* end */