don't allow allocates bigger than MAX(INTEGER)
This commit is contained in:
parent
9388fb69f8
commit
0e501983f4
1 changed files with 25 additions and 8 deletions
|
@ -59,8 +59,12 @@ IMPLEMENTATION MODULE Storage;
|
||||||
VAR nu : CARDINAL;
|
VAR nu : CARDINAL;
|
||||||
b : CARDINAL;
|
b : CARDINAL;
|
||||||
p, q: BucketPtr;
|
p, q: BucketPtr;
|
||||||
|
pc: POINTER TO CHAR;
|
||||||
brk : ADDRESS;
|
brk : ADDRESS;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
IF size > CARDINAL(MAX(INTEGER)) THEN
|
||||||
|
RETURN NIL;
|
||||||
|
END;
|
||||||
nu := (size + (UNIT-1)) DIV UNIT;
|
nu := (size + (UNIT-1)) DIV UNIT;
|
||||||
IF nu = 0 THEN
|
IF nu = 0 THEN
|
||||||
RETURN NIL;
|
RETURN NIL;
|
||||||
|
@ -72,6 +76,10 @@ IMPLEMENTATION MODULE Storage;
|
||||||
p := FreeLists[b];
|
p := FreeLists[b];
|
||||||
FreeLists[b] := p^.BNEXT;
|
FreeLists[b] := p^.BNEXT;
|
||||||
p^.BNEXT := USED;
|
p^.BNEXT := USED;
|
||||||
|
IF p^.BSIZE * UNIT # size THEN
|
||||||
|
pc := ADR(p^.BSTORE) + size;
|
||||||
|
pc^ := MAGICC;
|
||||||
|
END;
|
||||||
RETURN ADR(p^.BSTORE);
|
RETURN ADR(p^.BSTORE);
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
@ -91,6 +99,10 @@ IMPLEMENTATION MODULE Storage;
|
||||||
FreeLists[p^.BSIZE] := p;
|
FreeLists[p^.BSIZE] := p;
|
||||||
q^.BSIZE := nu;
|
q^.BSIZE := nu;
|
||||||
q^.BNEXT := USED;
|
q^.BNEXT := USED;
|
||||||
|
IF q^.BSIZE * UNIT # size THEN
|
||||||
|
pc := ADR(q^.BSTORE) + size;
|
||||||
|
pc^ := MAGICC;
|
||||||
|
END;
|
||||||
RETURN ADR(q^.BSTORE);
|
RETURN ADR(q^.BSTORE);
|
||||||
END;
|
END;
|
||||||
END;
|
END;
|
||||||
|
@ -122,6 +134,10 @@ IMPLEMENTATION MODULE Storage;
|
||||||
FreeLists[q^.BSIZE] := q;
|
FreeLists[q^.BSIZE] := q;
|
||||||
p^.BSIZE := nu;
|
p^.BSIZE := nu;
|
||||||
END;
|
END;
|
||||||
|
IF p^.BSIZE * UNIT # size THEN
|
||||||
|
pc := ADR(p^.BSTORE) + size;
|
||||||
|
pc^ := MAGICC;
|
||||||
|
END;
|
||||||
RETURN ADR(p^.BSTORE);
|
RETURN ADR(p^.BSTORE);
|
||||||
END;
|
END;
|
||||||
(* Give part of tail of original block.
|
(* Give part of tail of original block.
|
||||||
|
@ -131,6 +147,10 @@ IMPLEMENTATION MODULE Storage;
|
||||||
q^.BSIZE := nu;
|
q^.BSIZE := nu;
|
||||||
p^.BSIZE := p^.BSIZE - nu - 1;
|
p^.BSIZE := p^.BSIZE - nu - 1;
|
||||||
q^.BNEXT := USED;
|
q^.BNEXT := USED;
|
||||||
|
IF q^.BSIZE * UNIT # size THEN
|
||||||
|
pc := ADR(q^.BSTORE) + size;
|
||||||
|
pc^ := MAGICC;
|
||||||
|
END;
|
||||||
RETURN ADR(q^.BSTORE);
|
RETURN ADR(q^.BSTORE);
|
||||||
END;
|
END;
|
||||||
END;
|
END;
|
||||||
|
@ -152,6 +172,10 @@ IMPLEMENTATION MODULE Storage;
|
||||||
p := brk;
|
p := brk;
|
||||||
p^.BSIZE := nu;
|
p^.BSIZE := nu;
|
||||||
p^.BNEXT := USED;
|
p^.BNEXT := USED;
|
||||||
|
IF p^.BSIZE * UNIT # size THEN
|
||||||
|
pc := ADR(p^.BSTORE) + size;
|
||||||
|
pc^ := MAGICC;
|
||||||
|
END;
|
||||||
RETURN ADR(p^.BSTORE);
|
RETURN ADR(p^.BSTORE);
|
||||||
END MyAllocate;
|
END MyAllocate;
|
||||||
|
|
||||||
|
@ -161,19 +185,12 @@ IMPLEMENTATION MODULE Storage;
|
||||||
END Allocate;
|
END Allocate;
|
||||||
|
|
||||||
PROCEDURE ALLOCATE(VAR a: ADDRESS; size: CARDINAL);
|
PROCEDURE ALLOCATE(VAR a: ADDRESS; size: CARDINAL);
|
||||||
VAR p: BucketPtr;
|
|
||||||
pc: POINTER TO CHAR;
|
|
||||||
BEGIN
|
BEGIN
|
||||||
a := MyAllocate(size);
|
a := MyAllocate(size);
|
||||||
IF a = NIL THEN
|
IF a = NIL THEN
|
||||||
Message("out of core");
|
Message("out of core");
|
||||||
HALT;
|
HALT;
|
||||||
END;
|
END;
|
||||||
p := a - UNIT;
|
|
||||||
IF p^.BSIZE * UNIT # size THEN
|
|
||||||
pc := a + size;
|
|
||||||
pc^ := MAGICC;
|
|
||||||
END;
|
|
||||||
END ALLOCATE;
|
END ALLOCATE;
|
||||||
|
|
||||||
PROCEDURE Available(size: CARDINAL): BOOLEAN;
|
PROCEDURE Available(size: CARDINAL): BOOLEAN;
|
||||||
|
@ -212,7 +229,7 @@ IMPLEMENTATION MODULE Storage;
|
||||||
ELSIF (BSIZE*UNIT # size) THEN
|
ELSIF (BSIZE*UNIT # size) THEN
|
||||||
pc := a + size;
|
pc := a + size;
|
||||||
IF pc^ # MAGICC THEN
|
IF pc^ # MAGICC THEN
|
||||||
Message("(Warning) area corrupted");
|
Message("(Warning) heap corrupted or wrong size in deallocate");
|
||||||
END;
|
END;
|
||||||
END;
|
END;
|
||||||
IF BSIZE <= NLISTS THEN
|
IF BSIZE <= NLISTS THEN
|
||||||
|
|
Loading…
Reference in a new issue