Bladeren bron

+ add poll support for unix

git-svn-id: trunk@12128 -
micha 16 jaren geleden
bovenliggende
commit
4594758ae5
10 gewijzigde bestanden met toevoegingen van 176 en 0 verwijderingen
  1. 1 0
      .gitattributes
  2. 5 0
      rtl/bsd/bunxsysc.inc
  3. 23 0
      rtl/bsd/ostypes.inc
  4. 25 0
      rtl/haiku/ostypes.inc
  5. 5 0
      rtl/linux/bunxsysc.inc
  6. 23 0
      rtl/linux/ostypes.inc
  7. 25 0
      rtl/solaris/ostypes.inc
  8. 1 0
      rtl/unix/bunxh.inc
  9. 3 0
      rtl/unix/oscdeclh.inc
  10. 65 0
      tests/test/tpoll.pp

+ 1 - 0
.gitattributes

@@ -7800,6 +7800,7 @@ tests/test/tparray7.pp svneol=native#text/plain
 tests/test/tparray8.pp svneol=native#text/plain
 tests/test/tparray9.pp svneol=native#text/plain
 tests/test/tpftch1.pp svneol=native#text/plain
+tests/test/tpoll.pp svneol=native#text/plain
 tests/test/tprec1.pp svneol=native#text/plain
 tests/test/tprec10.pp svneol=native#text/plain
 tests/test/tprec11.pp svneol=native#text/plain

+ 5 - 0
rtl/bsd/bunxsysc.inc

@@ -456,6 +456,11 @@ begin
  fpSelect:=do_syscall(syscall_nr_select,n,TSysParam(readfds),TSysParam(writefds),TSysParam(exceptfds),TSysParam(timeout));
 end;
 
+function fpPoll(fds: ppollfd; nfds: cuint; timeout: clong): cint;
+begin
+  fpPoll:=do_syscall(syscall_nr_poll,tsysparam(fds),tsysparam(nfds),tsysparam(timeout));
+end;
+
 Function fpLstat(path:pchar;Info:pstat):cint;
 {
   Get all information on a link (the link itself), and return it in info.

+ 23 - 0
rtl/bsd/ostypes.inc

@@ -296,6 +296,29 @@ CONST
 {$endif}
   MAP_ANONYMOUS =$1000;
 
+const
+  POLLIN      = $0001;
+  POLLPRI     = $0002;
+  POLLOUT     = $0004;
+  POLLERR     = $0008;
+  POLLHUP     = $0010;
+  POLLNVAL    = $0020;
+
+  { XOpen, XPG 4.2 }
+  POLLRDNORM  = $0040;
+  POLLRDBAND  = $0080;
+  POLLWRNORM  = POLLOUT;
+  POLLWRBAND  = $0100;
+
+type
+  pollfd = record
+    fd: cint;
+    events: cshort;
+    revents: cshort;
+  end;
+  tpollfd = pollfd;
+  ppollfd = ^pollfd;
+
     {*************************************************************************}
     {                               SIGNALS                                   }
     {*************************************************************************}

+ 25 - 0
rtl/haiku/ostypes.inc

@@ -364,3 +364,28 @@ const B_SYMBOL_TYPE_ANY  = $5;
 { Constansts for MMAP }
 const
   MAP_ANONYMOUS =$1000;
+
+const
+  POLLIN      = $0001;
+  POLLOUT     = $0002;
+  POLLERR     = $0004;
+  POLLPRI     = $0020;
+  POLLHUP     = $0080;
+  POLLNVAL    = $1000;
+
+  { XOpen, XPG 4.2 }
+  POLLRDNORM  = POLLIN;
+  POLLRDBAND  = $0008;
+  POLLWRNORM  = POLLOUT;
+  POLLWRBAND  = $0010;
+
+type
+  pollfd = record
+    fd: cint;
+    events: cshort;
+    revents: cshort;
+  end;
+  tpollfd = pollfd;
+  ppollfd = ^pollfd;
+
+

+ 5 - 0
rtl/linux/bunxsysc.inc

@@ -400,6 +400,11 @@ begin
 {$endif bunxfunc_fpselect_implemented}
 end;
 
+function fpPoll(fds: ppollfd; nfds: cuint; timeout: clong): cint;
+begin
+  fpPoll:=do_syscall(syscall_nr_poll,tsysparam(fds),tsysparam(nfds),tsysparam(timeout));
+end;
+
 Function fpLstat(path:pchar;Info:pstat):cint;
 {
   Get all information on a link (the link itself), and return it in info.

+ 23 - 0
rtl/linux/ostypes.inc

@@ -163,6 +163,29 @@ type
   ptimezone =^timezone;
   TTimeZone = timezone;
 
+const
+  POLLIN      = $0001;
+  POLLPRI     = $0002;
+  POLLOUT     = $0004;
+  POLLERR     = $0008;
+  POLLHUP     = $0010;
+  POLLNVAL    = $0020;
+
+  { XOpen, XPG 4.2 }
+  POLLRDNORM  = $0040;
+  POLLRDBAND  = $0080;
+  POLLWRNORM  = $0100;
+  POLLWRBAND  = $0200;
+
+type
+  pollfd = record
+    fd: cint;
+    events: cshort;
+    revents: cshort;
+  end;
+  tpollfd = pollfd;
+  ppollfd = ^pollfd;
+
 {***********************************************************************}
 {                  POSIX CONSTANT ROUTINE DEFINITIONS                   }
 {***********************************************************************}

+ 25 - 0
rtl/solaris/ostypes.inc

@@ -240,3 +240,28 @@ type
          end;
  TTms= tms;
  pTms= ^tms;
+
+const
+  POLLIN      = $0001;
+  POLLPRI     = $0002;
+  POLLOUT     = $0004;
+  POLLERR     = $0008;
+  POLLHUP     = $0010;
+  POLLNVAL    = $0020;
+
+  { XOpen, XPG 4.2 }
+  POLLRDNORM  = $0040;
+  POLLRDBAND  = $0080;
+  POLLWRNORM  = POLLOUT;
+  POLLWRBAND  = $0100;
+
+type
+  pollfd = record
+    fd: cint;
+    events: cshort;
+    revents: cshort;
+  end;
+  tpollfd = pollfd;
+  ppollfd = ^pollfd;
+
+

+ 1 - 0
rtl/unix/bunxh.inc

@@ -90,6 +90,7 @@ Type TGrpArr = Array [0..0] of TGid;            { C style array workarounds}
     Function  FpFtruncate  (fd : cInt; flength : TOff): cInt;  external name 'FPC_SYSC_FTRUNCATE';
     Function  FPSigaction  (sig: cInt; act : pSigActionRec; oact : pSigActionRec): cint;  external name 'FPC_SYSC_SIGACTION';
     Function  FPSelect     (N:cint;readfds,writefds,exceptfds:pfdSet;TimeOut:PTimeVal):cint;
+    Function  FpPoll       (fds: ppollfd; nfds: cuint; timeout: clong): cint;
     Function  FpIOCtl      (Handle:cint;Ndx: TIOCtlRequest; Data: Pointer):cint; external name  'FPC_SYSC_IOCTL';
     Function  FpNanoSleep  (req : ptimespec;rem : ptimespec):cint; external name 'FPC_SYSC_NANOSLEEP';
     Function  fpLstat(path:pchar;Info:pstat):cint;

+ 3 - 0
rtl/unix/oscdeclh.inc

@@ -86,11 +86,14 @@ const
 {$ifdef beos}
   {$ifdef haiku}
     Function  FPSelect  (N:cint;readfds,writefds,exceptfds:pfdSet;TimeOut:PTimeVal):cint; cdecl; external 'network' name 'select';  
+    Function  FpPoll    (fds: ppollfd; nfds: cuint; timeout: clong): cint; cdecl; external 'network' name 'poll';
   {$else}
     Function  FPSelect  (N:cint;readfds,writefds,exceptfds:pfdSet;TimeOut:PTimeVal):cint; cdecl; external 'net' name 'select';
+    Function  FpPoll    (fds: ppollfd; nfds: cuint; timeout: clong): cint; cdecl; external 'net' name 'poll';
   {$endif}  
 {$else}
     Function  FPSelect  (N:cint;readfds,writefds,exceptfds:pfdSet;TimeOut:PTimeVal):cint; cdecl; external clib name 'select';
+    Function  FpPoll    (fds: ppollfd; nfds: cuint; timeout: clong): cint; cdecl; external clib name 'poll';
 {$endif}
     function  fpgetenv  (name : pchar):pchar; cdecl; external clib name 'getenv';
     Function  FpKill       (pid : TPid; sig: cInt): cInt; cdecl; external clib name 'kill';

+ 65 - 0
tests/test/tpoll.pp

@@ -0,0 +1,65 @@
+{%TARGET=darwin,haiku,linux,freebsd,netbsd,openbsd,solaris}
+
+{$mode fpc}
+
+uses
+  baseunix;
+
+const
+  testbyte = '!';
+
+var
+  pollfds: pollfd;
+  fds: array[0..1] of cint;
+  ret: cint;
+  x: char;
+begin
+  fppipe(fds);
+  pollfds.fd := fds[0];
+  pollfds.events := POLLIN;
+  pollfds.revents := 0;
+  ret := fppoll(@pollfds, 1, 10);
+  if ret <> 0 then
+  begin
+    writeln('poll returned ', ret, ' (expected 0 = timeout), errno=', errno);
+    halt(1);
+  end;
+  x := testbyte;
+  ret := fpwrite(fds[1], x, 1);
+  if ret <> 1 then
+  begin
+    writeln('write returned ', ret, ' (expected 1 byte), errno=', errno);
+    halt(2);
+  end;
+  ret := fppoll(@pollfds, 1, 10);
+  if ret <> 1 then
+  begin
+    writeln('poll returned ', ret, ' (expected 1 = data ready), errno=', errno);
+    halt(3);
+  end;
+  if (pollfds.revents and POLLIN) = 0 then
+  begin
+    writeln('poll did not set POLLIN');
+    halt(4);
+  end;
+  x := #0;
+  ret := fpread(fds[0], @x, 1);
+  if ret <> 1 then
+  begin
+    writeln('read returned ', ret, ' (expected 1 byte), errno=', errno);
+    halt(5);
+  end;
+  if x <> testbyte then
+  begin
+    writeln('test byte is ''', x, ''' (expected ''', testbyte, ''')');
+    halt(6);
+  end;
+  ret := fppoll(@pollfds, 1, 10);
+  if ret <> 0 then
+  begin
+    writeln('poll returned ', ret, ' (expected 0 = timeout), errno=', errno);
+    halt(7);
+  end;
+  fpclose(fds[0]);
+  fpclose(fds[1]);
+end.