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:
kieron 2020-07-17 22:29:27 +00:00
parent b802ac9607
commit 984b6a89c8
5 changed files with 111 additions and 54 deletions

View File

@ -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);

View File

@ -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.

View File

@ -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;

View File

@ -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));

View File

@ -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
; ;