jordan@aerospace.aero.org (Larry M. Jordan) (10/25/90)
The ShtHeap module in r1.06 works, but, don't expect to use the
example code offered in the User's Guide to prove it. I spent a few
trying minutes writing a memory-model-independent test that does work
and thought there may be someone out there who could benefit from my
headaches.) The following compilable sample shows how to use the ShtHeap
and based pointers, which have been around since v1.17, but until now I've
had no opportunity to use.
In summary: The test module allocates a block from the far heap
(via Storage module) and then grabs the paragraph address to give it to the
ShtHeap manager. Many allocations (more than 2) are made. All of this
storage is deallocated and the short heap integrity is checked
after each deallocation.
The code:
MODULE TestHeap;
IMPORT Storage;
IMPORT ShtHeap;
CONST
Low = 1;
High = 100;
TYPE
T = CARDINAL;
FarPointer = RECORD
offset, segment: CARDINAL
END;
VAR
ShortHeapAddress: FarADDRESS;
ShortHeapSegment: CARDINAL;
p: ARRAY [Low..High] OF POINTER ShortHeapSegment TO T;
i: CARDINAL;
BEGIN
Storage.FarAllocate(ShortHeapAddress, 10000);
(*
* We want the segment part of the pointer, and NOT:
*
* ShortHeapSegment := CARDINAL(Seg(ShortHeapAddress));
*
* as indicated in the User's Guide which returns the segment "containing"
* the pointer. Disasterous--we've given our data segment to
* the ShtHeap manager to manage!
*
* But rather:
*)
ShortHeapSegment := FarPointer(ShortHeapAddress).segment;
(*
* Initialize the short heap. We can ask that part or all be
* managed. Here we ask for all of it.
*)
ShtHeap.Initialize(ShortHeapSegment, 10000);
(* allocate a bunch of CARDINALs *)
FOR i := Low TO High DO
ShtHeap.Allocate(ShortHeapSegment, p[i], SIZE(T));
IF p[i] = ShtHeap.Nil THEN
HALT
END;
p[i]^ := i; (* use it *)
END;
(* deallocate them *)
FOR i := Low TO High DO
ShtHeap.Free(ShortHeapSegment, p[i], SIZE(T));
(* check heap integrity *)
ShtHeap.Test(ShortHeapSegment);
END;
END HeapTest.Dominique.Willems@p4610.f46.n295.z2.fidonet.org (Dominique Willems) (10/31/90)
Hi Larry, > ... thought there may be someone out there who could benefit from my > headaches.) The following compilable sample shows how to use the > ShtHeap and based pointers,... Indeed, you were VERY right! I wast just rewriting lots of code to work with the Short Heap system and had already coded (luckily not yet executed) the BAD JPI Initialize example, without their wrong ALLOCATE invocation of course (which in their manual is treated as a FUNCTION PROCEDURE instead of a proper one!). > * But rather: > *) > > ShortHeapSegment := FarPointer(ShortHeapAddress).segment; Thanks indeed, I had already blindly copied their example (shame on me to trust them! :-)). Imagine that; in a mere three lines of example code, they managed to put TWO grave errors (=66%)! Enfin, let's keep smiling! :-) Thanks again, Cheers, Domus -- uucp: uunet!m2xenix!puddle!2!295!46.4610!Dominique.Willems Internet: Dominique.Willems@p4610.f46.n295.z2.fidonet.org