Import backup from 2005-09-11
This commit is contained in:
1 parent
396c5f3452
commit
0521733e20
10 files changed
+1391
-79
No files matched your search
+41
-50
@@ -33,51 +33,35 @@ hash::hash()
|
||||
|
||||
int hash::add(u32_t key, void *val)
|
||||
{
|
||||
kprintf("$1$");
|
||||
u32_t hashed = hash_key(key);
|
||||
vector<hash_entry_t *> *vec = myTable[hashed];
|
||||
kprintf("$2$");
|
||||
if (!vec)
|
||||
myTable[hashed] = vec = new vector<hash_entry_t *>;
|
||||
for (u32_t i = 0; i < vec->size(); i++)
|
||||
if ( (*vec)[i]->key == key )
|
||||
for (u32_t i = 0; i < myTable[hashed].size(); i++)
|
||||
if ( myTable[hashed][i].key == key )
|
||||
return -1; // key exists already
|
||||
kprintf("$3$");
|
||||
hash_entry_t *he = (hash_entry_t *) New(hash_entry_t);
|
||||
kprintf("(");
|
||||
for (u32_t i = 0; i < vec->size(); i++)
|
||||
kprintf("%d,", (*vec)[i]->key);
|
||||
kprintf(")");
|
||||
he->key = key;
|
||||
he->data = val;
|
||||
vec->add(he);
|
||||
kprintf("hash.cpp: %d (slot %d) -> %d\n", key, hashed, val);
|
||||
hash_entry_t he = {key, val};
|
||||
kprintf("hash.cpp: going to add {%d, %d} to vector %d\n", he.key, he.data, hashed);
|
||||
myTable[hashed].add(he);
|
||||
kprintf("hash.cpp: finished adding %d -> %d\n",
|
||||
myTable[hashed][myTable[hashed].size()-1].key,
|
||||
myTable[hashed][myTable[hashed].size()-1].data);
|
||||
mySize++;
|
||||
kprintf("*%d*\t", mySize);
|
||||
if ( mySize > (hash_primes[mySizeIndex] << 1) ) // re-hash
|
||||
{
|
||||
kprintf("*1*");
|
||||
vector<hash_entry_t *> **oldTable = myTable;
|
||||
kprintf("re-hashing\n");
|
||||
vector< vector<hash_entry_t> > oldTable = myTable;
|
||||
mySizeIndex++;
|
||||
myTable = new (vector<hash_entry_t *> *)[hash_primes[mySizeIndex]];
|
||||
myTable = vector< vector<hash_entry_t> >();
|
||||
for (u32_t i = 0; i < hash_primes[mySizeIndex]; i++)
|
||||
myTable[i] = NULL;
|
||||
myTable.add(vector<hash_entry_t>());
|
||||
mySize = 0;
|
||||
kprintf("*2*");
|
||||
for (u32_t i = 0; i < hash_primes[mySizeIndex - 1]; i++)
|
||||
{
|
||||
if (oldTable[i])
|
||||
for (u32_t j = 0; j < oldTable[i].size(); j++)
|
||||
{
|
||||
for (u32_t j = 0; j < oldTable[i]->size(); j++)
|
||||
{
|
||||
add( (*(oldTable[i]))[j]->key,
|
||||
(*(oldTable[i]))[j]->data );
|
||||
kfree( (*(oldTable[i]))[j] );
|
||||
}
|
||||
delete oldTable[i];
|
||||
add( oldTable[i][j].key,
|
||||
oldTable[i][j].data );
|
||||
}
|
||||
}
|
||||
kprintf("*3*");
|
||||
delete oldTable;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -85,26 +69,19 @@ int hash::add(u32_t key, void *val)
|
||||
void *hash::get(u32_t key)
|
||||
{
|
||||
u32_t hashed = hash_key(key);
|
||||
vector<hash_entry_t *> *vec = myTable[hashed];
|
||||
if (!vec)
|
||||
return NULL;
|
||||
for (u32_t i = 0; i < vec->size(); i++)
|
||||
if ( (*vec)[i]->key == key )
|
||||
return (*vec)[i]->data;
|
||||
for (u32_t i = 0; i < myTable[hashed].size(); i++)
|
||||
if ( myTable[hashed][i].key == key )
|
||||
return myTable[hashed][i].data;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int hash::remove(u32_t key)
|
||||
{
|
||||
u32_t hashed = hash_key(key);
|
||||
vector<hash_entry_t *> *vec = myTable[hashed];
|
||||
if (!vec)
|
||||
return -1;
|
||||
for (u32_t i = 0; i < vec->size(); i++)
|
||||
if ( (*vec)[i]->key == key )
|
||||
for (u32_t i = 0; i < myTable[hashed].size(); i++)
|
||||
if ( myTable[hashed][i].key == key )
|
||||
{
|
||||
kfree( (*vec)[i] );
|
||||
vec->remove(i); // remove key
|
||||
myTable[hashed].remove(i); // remove key
|
||||
mySize--;
|
||||
return 0;
|
||||
}
|
||||
@@ -114,11 +91,8 @@ int hash::remove(u32_t key)
|
||||
int hash::exists(u32_t key)
|
||||
{
|
||||
u32_t hashed = hash_key(key);
|
||||
vector<hash_entry_t *> *vec = myTable[hashed];
|
||||
if (!vec)
|
||||
return 0;
|
||||
for (u32_t i = 0; i < vec->size(); i++)
|
||||
if ( (*vec)[i]->key == key )
|
||||
for (u32_t i = 0; i < myTable[hashed].size(); i++)
|
||||
if ( myTable[hashed][i].key == key )
|
||||
return 1; // key exists
|
||||
return 0;
|
||||
}
|
||||
@@ -132,3 +106,20 @@ u32_t hash::size()
|
||||
{
|
||||
return mySize;
|
||||
}
|
||||
|
||||
void hash::dump()
|
||||
{
|
||||
kprintf("hash table @ 0x%x : {\n", &myTable);
|
||||
for (u32_t i = 0; i < hash_primes[mySizeIndex]; i++)
|
||||
{
|
||||
kprintf("\t%d @ 0x%x (", i, &myTable[i]);
|
||||
for (u32_t j = 0; j < myTable[i].size(); j++)
|
||||
kprintf("%s%d -> %d @ 0x%x", (j ? ", " : ""),
|
||||
myTable[i][j].key,
|
||||
myTable[i][j].data,
|
||||
&myTable[i][j]);
|
||||
kprintf(")\n");
|
||||
}
|
||||
kprintf("}\n");
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@ public:
|
||||
/* Check if the given key exists in the hash table */
|
||||
int exists(u32_t key);
|
||||
|
||||
/* Dump a hash */
|
||||
void dump();
|
||||
|
||||
/* How many values are in the hash table */
|
||||
u32_t size();
|
||||
};
|
||||
|
||||
+17
-2
@@ -37,13 +37,28 @@ int proc_init()
|
||||
memset(&tss0, 0, sizeof(tss_t));
|
||||
tss0.ss0 = SEG_KERNEL_DATA;
|
||||
tss0.esp0 = VIRT_STACK_TOP;
|
||||
kprintf("make new hash\n");
|
||||
processes = new hash();
|
||||
for (u32_t i = 0; i < 110; i++)
|
||||
vector< vector<int> > test;
|
||||
for (u32_t i = 0; i < 5; i++)
|
||||
test.add(vector<int>());
|
||||
for (u32_t i = 0; i < 5; i++)
|
||||
for (u32_t j = 0; j < 3; j++)
|
||||
test[i].add(i*10+j);
|
||||
for (u32_t i = 0; i < 5; i++)
|
||||
for (u32_t j = 0; j < 3; j++)
|
||||
kprintf("<%d>", test[i][j]);
|
||||
for (u32_t i = 0; i < 11; i++)
|
||||
{
|
||||
kprintf("add %d to hash\n", i);
|
||||
processes->add(i, (void *) i);
|
||||
}
|
||||
for (u32_t i = 0; i < 110; i++)
|
||||
kprintf("\n\n");
|
||||
processes->dump();
|
||||
kprintf("\n\n");
|
||||
for (u32_t i = 0; i < 11; i++)
|
||||
{
|
||||
kprintf("get %d from hash\n", i);
|
||||
if (i != (u32_t)processes->get(i))
|
||||
kprintf(" !=: %d -> %d\n", i, processes->get(i));
|
||||
processes->remove(i);
|
||||
|
||||
Reference in new issue
Block a user