Changeset 31 for trunk/UDriveScan.pas


Ignore:
Timestamp:
Apr 30, 2016, 12:16:19 AM (8 years ago)
Author:
chronos
Message:
  • Added: TFileStreamEx experimental class to support flags O_DIRECT and O_SYNC under Linux.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UDriveScan.pas

    r29 r31  
    125125implementation
    126126
     127uses
     128  UFileStreamEx;
     129
    127130resourcestring
    128131  SUnknownRunMode = 'Unknown run mode';
     
    177180function TTestStream.Write(const Buffer; Count: Longint): Longint;
    178181begin
     182  Result := 0;
    179183end;
    180184
    181185function TTestStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
    182186begin
     187  Result := 0;
    183188end;
    184189
     
    293298  F: TStream;
    294299  RealSize: Integer;
    295   Buffer: array of Byte;
     300  Buffer: Pointer;
     301  BufferAligned: Pointer;
    296302  I: Integer;
     303  Alignment: Integer;
    297304begin
    298305  try
     
    301308    if ConfigTest then F := TTestStream.Create
    302309    else begin
     310      //if Mode = rmRead then F := TFileStreamEx.Create(DriveName, fmOpenRead, [ffDirect])
     311      //  else if Mode = rmWrite then F := TFileStreamEx.Create(DriveName, fmOpenReadWrite, [ffDirect]);
    303312      if Mode = rmRead then F := TFileStream.Create(DriveName, fmOpenRead)
    304313        else if Mode = rmWrite then F := TFileStream.Create(DriveName, fmOpenReadWrite);
    305314    end;
    306315    try
    307       SetLength(Buffer, SectorSize);
     316      Alignment := SectorSize;
     317      Buffer := GetMem(SectorSize + Alignment);
     318      BufferAligned := Pointer(Int64(Buffer) - (Int64(Buffer) and (Alignment - 1)) + Alignment);
    308319      if Mode = rmWrite then begin
    309320        if not WritePatternRandom then
    310           FillChar(Buffer[0], Length(Buffer), WritePattern)
    311           else for I := 0 to Length(Buffer) - 1 do
    312             Buffer[I] := Random(256);
     321          FillChar(BufferAligned^, SectorSize, WritePattern)
     322          else for I := 0 to SectorSize - 1 do
     323            PByte(Int64(BufferAligned) + I)^ := Random(256);
    313324      end;
    314325      while FSectorCurrent < SectorEnd do begin
     
    317328          DoChange;
    318329          F.Position := FSectorCurrent * SectorSize;
    319           if Mode = rmRead then RealSize := F.Read(Buffer[0], SectorSize)
    320             else if Mode = rmWrite then RealSize := F.Write(Buffer[0], SectorSize)
     330          if Mode = rmRead then RealSize := F.Read(BufferAligned^, SectorSize)
     331            else if Mode = rmWrite then RealSize := F.Write(BufferAligned^, SectorSize)
    321332            else raise Exception.Create(SUnknownRunMode);
    322333        finally
     
    333344        if Terminated then Break;
    334345      end;
     346      FreeMem(Buffer);
    335347    finally
    336348      F.Free;
Note: See TracChangeset for help on using the changeset viewer.