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

    {
     >MM> Is there a way to LOCK specific records or areas in a binary file so
     >MM> that one program can access the 1st byte of file and another program
     >MM> access the 2nd byte of the program at the same time?

     TC> Here's something from my own tool
     TC> box of tricks:
    }
    function FLock(Lock:byte; Handle: Word; Pos,Len: LongInt): Word; Assembler;
      ASM
          mov   AL,Lock   { subfunction 0: lock region   }
                          { subfunction 1: unlock region }
          mov   AH,$5C    { DOS function $5C: FLOCK    }
          mov   BX,Handle { put FileHandle in BX       }
          les   DX,Pos
          mov   CX,ES     { CX:DX begin position       }
          les   DI,Len
          mov   SI,ES     { SI:DI length lockarea      }
          int   $21       { Call DOS ...               }
          jb    @End      { if error then return AX    }
          xor   AX,AX     { else return 0              }
      @End:
    end {FLock};

    Comes in handy when descending TDosStream.

    TLockStream = object(TDosStream)
                    procedure write(var buf;count:word); virtual;
                  end;
    Procedure TLockStream.write(var buf;count:word);
       var isLocked : integer;
           curpos   : longint;
       Begin
         curpos := getpos;
         isLocked := Flock(0,handle,curpos,count);
         if   isLocked < 2
         then begin
                inherited write(buf,count);
                if   isLocked = 0
                then Flock(1,handle,curpos,count);
              end
         else status := isLocked;
      End;

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