Hashmaps now autoexpand based on loadFactor.
git-svn-id: https://spexeah.com:8443/svn/Asuro@1298 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
parent
b802ac9607
commit
984b6a89c8
@ -2040,6 +2040,7 @@ begin
|
|||||||
writestring(identifier);
|
writestring(identifier);
|
||||||
writestring('] ');
|
writestring('] ');
|
||||||
writestring(str);
|
writestring(str);
|
||||||
|
redrawWindows;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure Outputln(identifier : PChar; str : PChar);
|
procedure Outputln(identifier : PChar; str : PChar);
|
||||||
|
16
src/cpu.pas
16
src/cpu.pas
@ -262,6 +262,21 @@ begin
|
|||||||
printCapabilities(getTerminalHWND);
|
printCapabilities(getTerminalHWND);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure enableSSE();
|
||||||
|
begin
|
||||||
|
If CPUID.Capabilities0^.SSE then begin
|
||||||
|
asm
|
||||||
|
MOV EAX, CR0
|
||||||
|
AND AX, $FFFB
|
||||||
|
OR AX, $2
|
||||||
|
MOV CR0, EAX
|
||||||
|
MOV EAX, CR4
|
||||||
|
OR AX, 3 shl 9
|
||||||
|
MOV CR4, EAX
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
begin
|
begin
|
||||||
terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.');
|
terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.');
|
||||||
@ -270,6 +285,7 @@ begin
|
|||||||
getCPUIdentifier;
|
getCPUIdentifier;
|
||||||
getCPUCapabilities;
|
getCPUCapabilities;
|
||||||
getCPUClockSpeed;
|
getCPUClockSpeed;
|
||||||
|
enableSSE;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
@ -3,7 +3,7 @@ unit hashmap;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
md5, util, strings, lmemorymanager, console;
|
md5, util, strings, lmemorymanager, console, tracer;
|
||||||
|
|
||||||
type
|
type
|
||||||
DPHashItem = ^PHashItem;
|
DPHashItem = ^PHashItem;
|
||||||
@ -17,14 +17,15 @@ type
|
|||||||
PHashMap = ^THashMap;
|
PHashMap = ^THashMap;
|
||||||
THashMap = record
|
THashMap = record
|
||||||
Size : uint32;
|
Size : uint32;
|
||||||
|
LoadFactor : Single;
|
||||||
|
Count : uint32;
|
||||||
Table : DPHashItem;
|
Table : DPHashItem;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function new(size : uint32) : PHashMap;
|
function new(size : uint32) : PHashMap;
|
||||||
procedure add(map : PHashMap; key : pchar; value : void);
|
procedure add(map : PHashMap; key : pchar; value : void);
|
||||||
function get(map : PHashMap; key : pchar) : void;
|
function get(map : PHashMap; key : pchar) : void;
|
||||||
procedure delete(map : PHashMap; key : pchar);
|
procedure delete(map : PHashMap; key : pchar; freeItem : boolean);
|
||||||
procedure deleteAndFree(map : PHashMap; key : pchar);
|
|
||||||
procedure printMap(map : PHashMap);
|
procedure printMap(map : PHashMap);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -59,6 +60,69 @@ begin
|
|||||||
newItem^.Hash:= 0;
|
newItem^.Hash:= 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure putItem(table : DPHashItem; item : PHashItem; idx : uint32);
|
||||||
|
var
|
||||||
|
ExistingItem : PHashItem;
|
||||||
|
c : uint32;
|
||||||
|
|
||||||
|
begin
|
||||||
|
tracer.push_trace('hashmap.putItem.1');
|
||||||
|
ExistingItem:= table[idx];
|
||||||
|
tracer.push_trace('hashmap.putItem.2');
|
||||||
|
if ExistingItem = nil then begin
|
||||||
|
tracer.push_trace('hashmap.putItem.3');
|
||||||
|
table[idx]:= item;
|
||||||
|
end else begin
|
||||||
|
tracer.push_trace('hashmap.putItem.4');
|
||||||
|
c:=0;
|
||||||
|
while ExistingItem^.Next <> nil do begin
|
||||||
|
tracer.push_trace('hashmap.putItem.5');
|
||||||
|
ExistingItem:= ExistingItem^.Next;
|
||||||
|
end;
|
||||||
|
tracer.push_trace('hashmap.putItem.6');
|
||||||
|
ExistingItem^.Next:= item;
|
||||||
|
tracer.push_trace('hashmap.putItem.6');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure checkAndRebase(map : PHashMap);
|
||||||
|
var
|
||||||
|
size : Single;
|
||||||
|
loadFactor : Single;
|
||||||
|
max_load : Single;
|
||||||
|
NewTable : DPHashItem;
|
||||||
|
NewSize : uint32;
|
||||||
|
i : uint32;
|
||||||
|
Item : PHashItem;
|
||||||
|
Next : PHashItem;
|
||||||
|
|
||||||
|
begin
|
||||||
|
size:= map^.size;
|
||||||
|
loadFactor:= map^.LoadFactor;
|
||||||
|
max_load:= size * loadFactor;
|
||||||
|
if map^.count > max_load then begin
|
||||||
|
NewSize:= map^.Size * 2;
|
||||||
|
NewTable:= DPHashItem(kalloc(sizeof(PHashItem) * NewSize));
|
||||||
|
for i:=0 to NewSize-1 do begin
|
||||||
|
NewTable[i]:= nil;
|
||||||
|
end;
|
||||||
|
If NewTable <> nil then begin
|
||||||
|
for i:=0 to map^.size-1 do begin
|
||||||
|
item:= map^.table[i];
|
||||||
|
while item <> nil do begin
|
||||||
|
Next:= item^.Next;
|
||||||
|
item^.Next:= nil;
|
||||||
|
putItem(NewTable, item, hashIndex(NewSize, item^.hash));
|
||||||
|
item:= Next;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
kfree(void(map^.table));
|
||||||
|
map^.table:= NewTable;
|
||||||
|
map^.size:= NewSize;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure add(map : PHashMap; key : pchar; value : void);
|
procedure add(map : PHashMap; key : pchar; value : void);
|
||||||
var
|
var
|
||||||
Idx : uint32;
|
Idx : uint32;
|
||||||
@ -92,6 +156,8 @@ begin
|
|||||||
if Item^.Key = nil then Item^.Key:= stringCopy(key);
|
if Item^.Key = nil then Item^.Key:= stringCopy(key);
|
||||||
Item^.Data:= value;
|
Item^.Data:= value;
|
||||||
Item^.Hash:= hash;
|
Item^.Hash:= hash;
|
||||||
|
inc(map^.count);
|
||||||
|
checkAndRebase(map);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -125,13 +191,15 @@ begin
|
|||||||
Map:= PHashMap(kalloc(sizeof(THashMap)));
|
Map:= PHashMap(kalloc(sizeof(THashMap)));
|
||||||
Map^.size:= size;
|
Map^.size:= size;
|
||||||
Map^.Table:= DPHashItem(Kalloc(sizeof(PHashItem) * Size));
|
Map^.Table:= DPHashItem(Kalloc(sizeof(PHashItem) * Size));
|
||||||
|
Map^.LoadFactor:= 0.75;
|
||||||
|
Map^.Count:= 0;
|
||||||
for i:=0 to size-1 do begin
|
for i:=0 to size-1 do begin
|
||||||
Map^.Table[i]:= nil;
|
Map^.Table[i]:= nil;
|
||||||
end;
|
end;
|
||||||
new:= Map;
|
new:= Map;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure deleteAndFree(map : PHashMap; key : pchar);
|
procedure delete(map : PHashMap; key : pchar; freeItem : boolean);
|
||||||
var
|
var
|
||||||
Idx : uint32;
|
Idx : uint32;
|
||||||
hash : uint32;
|
hash : uint32;
|
||||||
@ -144,6 +212,7 @@ begin
|
|||||||
hash:= KeyHash(key);
|
hash:= KeyHash(key);
|
||||||
Idx:= hashIndex(map^.size, hash);
|
Idx:= hashIndex(map^.size, hash);
|
||||||
Item:= map^.table[Idx];
|
Item:= map^.table[Idx];
|
||||||
|
if Item <> nil then begin
|
||||||
while not StringEquals(Item^.key, key) do begin
|
while not StringEquals(Item^.key, key) do begin
|
||||||
Prev:= Item;
|
Prev:= Item;
|
||||||
Item:= Item^.Next;
|
Item:= Item^.Next;
|
||||||
@ -158,41 +227,11 @@ begin
|
|||||||
map^.table[Idx]:= nil;
|
map^.table[Idx]:= nil;
|
||||||
end;
|
end;
|
||||||
kfree(void(Item^.Key));
|
kfree(void(Item^.Key));
|
||||||
kfree(void(Item^.Data));
|
if freeItem then kfree(void(Item^.Data));
|
||||||
kfree(void(Item));
|
kfree(void(Item));
|
||||||
|
dec(map^.count);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
|
|
||||||
procedure delete(map : PHashMap; key : pchar);
|
|
||||||
var
|
|
||||||
Idx : uint32;
|
|
||||||
hash : uint32;
|
|
||||||
Item : PHashItem;
|
|
||||||
Prev : PHashItem;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Prev:= nil;
|
|
||||||
if (map <> nil) and (key <> nil) then begin
|
|
||||||
hash:= KeyHash(key);
|
|
||||||
Idx:= hashIndex(map^.size, hash);
|
|
||||||
Item:= map^.table[Idx];
|
|
||||||
while not StringEquals(Item^.key, key) do begin
|
|
||||||
Prev:= Item;
|
|
||||||
Item:= Item^.Next;
|
|
||||||
if Item = nil then break;
|
|
||||||
end;
|
|
||||||
if Item <> nil then begin
|
|
||||||
If Prev <> nil then Prev^.Next:= Item^.Next;
|
|
||||||
If Prev = nil then begin
|
|
||||||
if Item^.Next <> nil then
|
|
||||||
map^.table[Idx]:= Item^.Next
|
|
||||||
else
|
|
||||||
map^.table[Idx]:= nil;
|
|
||||||
end;
|
|
||||||
kfree(void(Item^.Key));
|
|
||||||
kfree(void(Item));
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -178,7 +178,9 @@ begin
|
|||||||
console.init();
|
console.init();
|
||||||
|
|
||||||
{ CPUID }
|
{ CPUID }
|
||||||
|
console.outputln('CPU', 'Init begin');
|
||||||
cpu.init();
|
cpu.init();
|
||||||
|
console.outputln('CPU', 'Init end');
|
||||||
|
|
||||||
{ Call Tracer }
|
{ Call Tracer }
|
||||||
tracer.init();
|
tracer.init();
|
||||||
@ -242,8 +244,7 @@ begin
|
|||||||
|
|
||||||
tracer.push_trace('kmain.TICK');
|
tracer.push_trace('kmain.TICK');
|
||||||
|
|
||||||
|
HM:= hashmap.new(16);
|
||||||
HM:= hashmap.new(10000);
|
|
||||||
hashmap.add(HM, 'testificate', void(1));
|
hashmap.add(HM, 'testificate', void(1));
|
||||||
hashmap.add(HM, 'asuro', void(10));
|
hashmap.add(HM, 'asuro', void(10));
|
||||||
hashmap.add(HM, 'myfirstos', void(100));
|
hashmap.add(HM, 'myfirstos', void(100));
|
||||||
|
@ -63,8 +63,8 @@ dd 0
|
|||||||
dd 0
|
dd 0
|
||||||
dd 0
|
dd 0
|
||||||
dd 0
|
dd 0
|
||||||
|
dd 1280
|
||||||
dd 1024
|
dd 1024
|
||||||
dd 768
|
|
||||||
dd 16
|
dd 16
|
||||||
|
|
||||||
;
|
;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user