[Back to STREAMS SWAG index]  [Back to Main SWAG index]  [Original]

{
There's a bug in TEMSStream.Done.  It leaves EMSCurHandle and EMSCurPage with
the last used values, even though it's releasing an EMS handle, which may
well be EMSCurHandle.  This means that if you allocate a second EMSStream
after disposing of the first one, it can happen that it sees the page frame
as already valid, when in fact it should load it.
A workaround is to set EMSCurHandle := $FFFF after calling TEMSStream.Done.

Here's some sample code to demonstrate the bug.  It was posted to Usenet's
comp.lang.pascal:

  From: paf@fbit.msk.su (Alexander Petrosyan)
  Subject: TEMSStream trouble (Bug?)
  Date: Mon, 26 Sep 94 16:24:34 +0400

  Try to compile and run this prog:
}

uses
  Objects,
  wincrt;

var
  ES: TEMSStream;
  A, B: array [0..$400-1] of Byte;
  I, J: Integer;

procedure Error;
begin
  WriteLn ('Error !');
  ES.Done;
  Halt (1);
end;

begin
  FillChar (A, $400, 1);
  ES.Init (18 * $400, 18 * $400);            { Allocate 18K EMS }
  for I := 1 to 18 do ES.Write (A, $400);    { Fill with 1 }
  ES.Seek (0);
  for I := 1 to 10{*} do begin                  { Read 10K of 18K }
    ES.Read (B, $400);
    for J := Low (B) to High (B) do if B[J] <> 1 then { Verify }
      Error;
  end;
  ES.Done;                                   { Free allocated EMS }

{ Above code causes problem to below code }

(*  emscurhandle := $ffff;  *)    { Uncomment this line to fix the bug }

  FillChar (A, $400, 2);
  ES.Init (79 * $400, 79 * $400);            { Allocate 79K EMS }
  for I := 1 to 79 do ES.Write (A, $400);    { Fill with 2 }
  ES.Seek (0);
  for I := 1 to 79 do begin                  { Verify ALL }
    ES.Read (B, $400);
    for J := Low (B) to High (B) do if B[J] <> 2 then
      Error;  { I'm getting error at this point. Why? }
  end;
  ES.Done;

  writeln('Done');
{
  It seems that 1st page of this stream when being read are mapped not to the
  right place but to some page of previous stream.
}
end.

(*
It seems to me that error occurs when stream position at dispose time not in
last 16K EMS page (stream must be readed before dispose).

In this example we are writing 18K but reading 10K leaving stream position
not  in last page. When I change 10 to 18 at {*} all goes OK.
*)

[Back to STREAMS SWAG index]  [Back to Main SWAG index]  [Original]