fd related central definition and small performance tweak in lcoreselect
authorbeware <beware@bircd.org>
Sat, 20 Feb 2010 18:33:54 +0000 (18:33 +0000)
committerbeware <beware@bircd.org>
Sat, 20 Feb 2010 18:33:54 +0000 (18:33 +0000)
git-svn-id: file:///svnroot/lcore/trunk@83 b1de8a11-f9be-4011-bde0-cc7ace90066a

fd_utils.pas
lcoreselect.pas

index de89e5fedaf41cc8d7a2aa60723142ee278b278d..290eb059a06b27e5a5c7644a6937ecb27fc611fb 100755 (executable)
 unit fd_utils;\r
 interface\r
 \r
 unit fd_utils;\r
 interface\r
 \r
+const\r
+    FDwordshift=5;\r
+    FDwordmaxbit=(1 shl FDwordshift)-1;\r
+\r
 type\r
 type\r
-    FDSet= Array [0..255] of longint; {31}\r
+    FDword=longint;\r
+    FDSet= Array [0..255] of fdword; {31}\r
     PFDSet= ^FDSet;\r
 \r
 Procedure FD_Clr(fd:longint;var fds:fdSet);\r
     PFDSet= ^FDSet;\r
 \r
 Procedure FD_Clr(fd:longint;var fds:fdSet);\r
@@ -44,7 +49,7 @@ Procedure FD_Clr(fd:longint;var fds:fdSet);{$ifdef useinline}inline;{$endif}
 { Remove fd from the set of filedescriptors}\r
 begin\r
   if (fd < 0) then raise exception.create('FD_Clr fd out of range: '+inttostr(fd));\r
 { Remove fd from the set of filedescriptors}\r
 begin\r
   if (fd < 0) then raise exception.create('FD_Clr fd out of range: '+inttostr(fd));\r
-  fds[fd shr 5]:=fds[fd shr 5] and (not (1 shl (fd and 31)));\r
+  fds[fd shr fdwordshift]:=fds[fd shr fdwordshift] and (not (1 shl (fd and fdwordmaxbit)));\r
 end;\r
 \r
 Procedure FD_Zero(var fds:fdSet);\r
 end;\r
 \r
 Procedure FD_Zero(var fds:fdSet);\r
@@ -57,7 +62,7 @@ Procedure FD_Set(fd:longint;var fds:fdSet);{$ifdef useinline}inline;{$endif}
 { Add fd to the set of filedescriptors }\r
 begin\r
   if (fd < 0) then raise exception.create('FD_set fd out of range: '+inttostr(fd));\r
 { Add fd to the set of filedescriptors }\r
 begin\r
   if (fd < 0) then raise exception.create('FD_set fd out of range: '+inttostr(fd));\r
-  fds[fd shr 5]:=fds[fd shr 5] or (1 shl (fd and 31));\r
+  fds[fd shr fdwordshift]:=fds[fd shr fdwordshift] or (1 shl (fd and fdwordmaxbit));\r
 end;\r
 \r
 Function FD_IsSet(fd:longint;var fds:fdSet):boolean;{$ifdef useinline}inline;{$endif}\r
 end;\r
 \r
 Function FD_IsSet(fd:longint;var fds:fdSet):boolean;{$ifdef useinline}inline;{$endif}\r
@@ -67,6 +72,6 @@ begin
     result := false;\r
     exit;\r
   end;\r
     result := false;\r
     exit;\r
   end;\r
-  FD_IsSet:=((fds[fd shr 5] and (1 shl (fd and 31)))<>0);\r
+  FD_IsSet:=((fds[fd shr fdwordshift] and (1 shl (fd and fdwordmaxbit)))<>0);\r
 end;\r
 end.\r
 end;\r
 end.\r
index feb8ef8b6388e2fa39bd66899c1a82fe3ff11b52..659bfce58d8daf099acc0f7cab9fa888271fedd5 100755 (executable)
@@ -93,6 +93,7 @@ var
   tempsocket    : tlasio  ;\r
   socketcount   : integer ; // for debugging perposes :)\r
   dw,bt:integer;\r
   tempsocket    : tlasio  ;\r
   socketcount   : integer ; // for debugging perposes :)\r
   dw,bt:integer;\r
+  currentfdword:fdword;\r
   fd : integer;\r
 begin\r
   //writeln('entering processasios');\r
   fd : integer;\r
 begin\r
   //writeln('entering processasios');\r
@@ -104,10 +105,11 @@ begin
 \r
   {------- test optimised loop}\r
   socketcount := 0;\r
 \r
   {------- test optimised loop}\r
   socketcount := 0;\r
-  for dw := (maxs shr 5) downto 0 do if (fdsr[dw] or fdsw[dw]) <> 0 then begin\r
-    for bt := 0 to 31 do if (fdsr[dw] or fdsw[dw]) and (1 shl bt) <> 0 then begin\r
+  for dw := (maxs shr fdwordshift) downto 0 do if (fdsr[dw] or fdsw[dw]) <> 0 then begin\r
+    currentfdword := (fdsr[dw] or fdsw[dw]);\r
+    for bt := fdwordmaxbit downto 0 do if currentfdword and (1 shl bt) <> 0 then begin\r
       inc(socketcount);\r
       inc(socketcount);\r
-      fd := dw shl 5 or bt;\r
+      fd := dw shl fdwordshift or bt;\r
       //writeln('reversing fd ',fd);\r
       currentsocket := fdreverse[fd];\r
       {if not assigned(currentsocket) then raise exception.create('currentsocket not assigned');\r
       //writeln('reversing fd ',fd);\r
       currentsocket := fdreverse[fd];\r
       {if not assigned(currentsocket) then raise exception.create('currentsocket not assigned');\r