Kaynağa Gözat

+ Add pread/pwrite system calls
* Optimize video using pwrite

git-svn-id: trunk@2705 -

daniel 19 yıl önce
ebeveyn
işleme
740c68106b

+ 12 - 1
rtl/linux/bunxsysc.inc

@@ -527,7 +527,18 @@ Function fpSymlink(oldname,newname:pchar):cint;
 }
 
 begin
- fpsymlink:=do_syscall(syscall_nr_symlink,TSysParam(oldname),TSysParam(newname));
+  fpsymlink:=do_syscall(syscall_nr_symlink,TSysParam(oldname),TSysParam(newname));
 end;
 
+function Fppread(fd: cint; buf: pchar; nbytes : size_t; offset:Toff): ssize_t; [public, alias : 'FPC_SYSC_PREAD'];
+
+begin
+  Fppread:=do_syscall(syscall_nr_pread,Fd,TSysParam(buf),nbytes,offset,0);
+end;
+
+function Fppwrite(fd: cint;buf:pchar; nbytes : size_t; offset:Toff): ssize_t; [public, alias : 'FPC_SYSC_PWRITE'];
+
+begin
+  Fppwrite:=do_syscall(syscall_nr_pwrite,Fd,TSysParam(buf),nbytes,offset,0);
+end;
 

+ 12 - 0
rtl/linux/ossysc.inc

@@ -61,7 +61,19 @@ function Fpwrite(fd: cint;buf:pchar; nbytes : size_t): ssize_t; [public, alias :
 begin
  Fpwrite:=do_syscall(syscall_nr_write,Fd,TSysParam(buf),nbytes);
 end;
+{
+function Fppread(fd: cint; buf: pchar; nbytes : size_t; offset:Toff): ssize_t; [public, alias : 'FPC_SYSC_PREAD'];
+
+begin
+  Fpread:=do_syscall(syscall_nr_pread,Fd,TSysParam(buf),nbytes,offset);
+end;
 
+function Fppwrite(fd: cint;buf:pchar; nbytes : size_t; offset:Toff): ssize_t; [public, alias : 'FPC_SYSC_PWRITE'];
+
+begin
+ Fpwrite:=do_syscall(syscall_nr_pwrite,Fd,TSysParam(buf),nbytes,offset);
+end;
+}
 function Fpunlink(path: pchar): cint; [public, alias : 'FPC_SYSC_UNLINK'];
 
 begin

+ 1 - 1
rtl/unix/baseunix.pp

@@ -59,7 +59,7 @@ Uses Sysctl;
 {$ifndef FPC_USE_LIBC}
   {$i syscallh.inc}       // do_syscall declarations themselves
   {$i sysnr.inc}          // syscall numbers.
-  {$i bsyscall.inc}  			// cpu specific syscalls
+  {$i bsyscall.inc}       // cpu specific syscalls
   {$i bunxsysc.inc}       // syscalls in system unit.
   {$i settimeo.inc}
 {$endif}

+ 6 - 0
rtl/unix/bunxh.inc

@@ -79,7 +79,13 @@ Type TGrpArr = Array [0..0] of TGid;            { C style array workarounds}
     Function  FpClose      (fd : cInt): cInt;  external name 'FPC_SYSC_CLOSE';
 
     Function  FpRead       (fd : cInt; buf: pChar; nbytes : TSize): TSsize; external name 'FPC_SYSC_READ';
+{$ifdef linux}
+    Function  FppRead      (fd : cInt; buf: pChar; nbytes : TSize; offset:Toff): TSsize;
+{$endif}
     Function  FpWrite      (fd : cInt; buf:pChar; nbytes : TSize): TSsize; external name 'FPC_SYSC_WRITE';
+{$ifdef linux}
+    Function  FppWrite     (fd : cInt; buf:pChar; nbytes : TSize; offset:Toff): TSsize;
+{$endif}
     Function  FpLseek      (fd : cInt; offset : TOff; whence : cInt): TOff; external name 'FPC_SYSC_LSEEK';
     Function  FpTime       (var tloc : TTime): TTime; external name 'FPC_SYSC_TIME';
     Function  FpFtruncate  (fd : cInt; flength : TOff): cInt;  external name 'FPC_SYSC_FTRUNCATE';

+ 14 - 0
rtl/unix/bunxovl.inc

@@ -175,6 +175,20 @@ begin
  FpWrite:=FpWrite(fd,pchar(@buf),nbytes);
 end;
 
+{$ifdef linux}
+function  FppRead           (fd : cInt;var buf; nbytes : TSize; offset:Toff): TSsize; {$ifdef VER2_0}inline;{$endif}
+
+begin
+  FppRead:=FppRead(fd,pchar(@buf),nbytes,offset);
+end;
+
+function  FppWrite          (fd : cInt;const buf; nbytes : TSize; offset:Toff): TSsize; {$ifdef VER2_0}inline;{$endif}
+
+begin
+  FppWrite:=FppWrite(fd,pchar(@buf),nbytes,offset);
+end;
+{$endif}
+
 Function  FpOpen    (path : pChar; flags : cInt):cInt; {$ifdef VER2_0}inline;{$endif}
 
 begin

+ 4 - 0
rtl/unix/bunxovlh.inc

@@ -48,6 +48,10 @@ Function  FPFStat   (var F:File;Var Info:stat):Boolean; inline;
 Function  FpSignal  (signum:longint;Handler:signalhandler):signalhandler;
 Function  FpRead    (fd : cInt; var buf; nbytes : TSize): TSsize; inline;
 Function  FpWrite   (fd : cInt; const buf; nbytes : TSize): TSsize; inline;
+{$ifdef linux}
+function  FppRead   (fd : cInt; var buf; nbytes : TSize; offset:Toff): TSsize; inline;
+function  FppWrite  (fd : cInt; const buf; nbytes : TSize; offset:Toff): TSsize; inline;
+{$endif}
 Function  FpDup     (var oldfile,newfile:text):cint;
 Function  FpDup     (var oldfile,newfile:file):cint;
 Function  FpDup2    (var oldfile,newfile:text):cint;

+ 26 - 28
rtl/unix/keyboard.pp

@@ -201,23 +201,22 @@ var oldesc0,oldesc1,oldesc2,oldesc4,oldesc8:word;
 
 procedure prepare_patching;
 
-var e:^chgentry;
-    entry : kbentry;
+var entry : kbentry;
     i:longint;
 
 begin
   for i:=low(kbdchange) to high(kbdchange) do
-   begin
-     e:=@kbdchange[i];
-     entry.kb_table:=e^.tab;
-     entry.kb_index:=e^.idx;
-     fpIoctl(stdinputhandle,KDGKBENT,@entry);
-     e^.oldval:=entry.kb_value;
-     entry.kb_table:=e^.oldtab;
-     entry.kb_index:=e^.oldidx;
-     fpioctl(stdinputhandle,KDGKBENT,@entry);
-     e^.newval:=entry.kb_value;
-   end;
+   with kbdchange[i] do
+     begin
+       entry.kb_table:=tab;
+       entry.kb_index:=idx;
+       fpIoctl(stdinputhandle,KDGKBENT,@entry);
+       oldval:=entry.kb_value;
+       entry.kb_table:=oldtab;
+       entry.kb_index:=oldidx;
+       fpioctl(stdinputhandle,KDGKBENT,@entry);
+       newval:=entry.kb_value;
+     end;
   {Save old escape code.}
   entry.kb_index:=1;
   entry.kb_table:=0;
@@ -239,7 +238,6 @@ end;
 
 procedure PatchKeyboard;
 var
-  e : ^chgentry;
   entry : kbentry;
   sentry : kbsentry;
   i:longint;
@@ -248,13 +246,13 @@ begin
   meta:=K_ESCPREFIX;
   fpIoctl(stdinputhandle,KDSKBMETA,@meta);
   for i:=low(kbdchange) to high(kbdchange) do
-   begin
-     e:=@kbdchange[i];
-     entry.kb_table:=e^.tab;
-     entry.kb_index:=e^.idx;
-     entry.kb_value:=e^.newval;
-     fpioctl(stdinputhandle,KDSKBENT,@entry);
-   end;
+    with kbdchange[i] do
+      begin
+        entry.kb_table:=tab;
+        entry.kb_index:=idx;
+        entry.kb_value:=newval;
+        fpioctl(stdinputhandle,KDSKBENT,@entry);
+      end;
 
   {Map kernel escape key code to symbol F32.}
   entry.kb_index:=1;
@@ -286,13 +284,13 @@ begin
   if oldmeta in [K_ESCPREFIX,K_METABIT] then
     fpioctl(stdinputhandle,KDSKBMETA,@oldmeta);
   for i:=low(kbdchange) to high(kbdchange) do
-   begin
-     e:=@kbdchange[i];
-     entry.kb_table:=e^.tab;
-     entry.kb_index:=e^.idx;
-     entry.kb_value:=e^.oldval;
-     fpioctl(stdinputhandle,KDSKBENT,@entry);
-   end;
+    with kbdchange[i] do
+      begin
+        entry.kb_table:=tab;
+        entry.kb_index:=idx;
+        entry.kb_value:=oldval;
+        fpioctl(stdinputhandle,KDSKBENT,@entry);
+      end;
 
   entry.kb_index:=1;
   entry.kb_table:=0;

+ 4 - 10
rtl/unix/video.pp

@@ -973,8 +973,7 @@ begin
 {$ifdef linux}
   if Console=ttylinux then
    begin
-     fplSeek(TTYFd, 4, Seek_Set);
-     fpWrite(TTYFd, VideoBuf^,VideoBufSize);
+     fppwrite(TTYFd, VideoBuf^,VideoBufSize,4);
    end
   else
    begin
@@ -1003,19 +1002,14 @@ begin
 {$ifdef linux}
   if Console=ttylinux then
    begin
-     fplSeek(TTYFd, 2, Seek_Set);
      Pos[1]:=NewCursorX;
      Pos[2]:=NewCursorY;
-     fpWrite(TTYFd, Pos, 2);
+     fppwrite(ttyfd,pos,2,2);
    end
   else
-   begin
-{$endif}
-     { newcursorx,y and CursorX,Y are 0 based ! }
-     SendEscapeSeq(XY2Ansi(NewCursorX+1,NewCursorY+1,CursorX+1,CursorY+1));
-{$ifdef linux}
-   end;
 {$endif}
+    { newcursorx,y and CursorX,Y are 0 based ! }
+    SendEscapeSeq(XY2Ansi(NewCursorX+1,NewCursorY+1,CursorX+1,CursorY+1));
   CursorX:=NewCursorX;
   CursorY:=NewCursorY;
 end;