[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]