Forum > FPC development
[SOLVED] Improvement of function TSocketServer.RunIdleLoop
(1/1)
lagprogramming:
packages/fcl-net/src/ssockets.pp has the following function:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function TSocketServer.RunIdleLoop: Boolean; // Run Accept idle loop. Return True if there is a new connection waiting{$if defined(unix) or defined(windows)}var FDS: TFDSet; TimeV: TTimeVal;{$endif}begin Repeat Result:=False;{$if defined(unix) or defined(windows)} TimeV.tv_usec := (AcceptIdleTimeout mod 1000) * 1000; TimeV.tv_sec := AcceptIdleTimeout div 1000;{$endif}{$ifdef unix} FDS := Default(TFDSet); fpFD_Zero(FDS); fpFD_Set(FSocket, FDS); Result := fpSelect(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0;{$else}{$ifdef windows} FDS := Default(TFDSet); FD_Zero(FDS); FD_Set(FSocket, FDS); Result := winsock2.Select(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0;{$endif}{$endif} If not Result then DoOnIdle; Until Result or (Not FAccepting);end;The repeat loop contains an unnecessary conditional jump.
The patch at the end of the post changes
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---If not Result then DoOnIdle;Until Result or (Not FAccepting);with
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---If Result then break;DoOnIdle;Until (Not FAccepting);
Here is the patch
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---diff --git a/packages/fcl-net/src/ssockets.pp b/packages/fcl-net/src/ssockets.ppindex 755af6d8bf..26da36d7fa 100644--- a/packages/fcl-net/src/ssockets.pp+++ b/packages/fcl-net/src/ssockets.pp@@ -928,9 +928,10 @@ function TSocketServer.RunIdleLoop: Boolean; Result := winsock2.Select(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0; {$endif} {$endif}- If not Result then- DoOnIdle;- Until Result or (Not FAccepting);+ If Result then+ break;+ DoOnIdle;+ Until (Not FAccepting); end; procedure TSocketServer.Listen;
bytebites:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---Until (Not FAccepting); Unnecessary ().
runewalsh:
Also
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---{$ifdef unix} FDS := Default(TFDSet); fpFD_Zero(FDS); fpFD_Set(FSocket, FDS); Result := fpSelect(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0;{$else}{$ifdef windows} FDS := Default(TFDSet); FD_Zero(FDS); FD_Set(FSocket, FDS); Result := winsock2.Select(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0;{$endif}{$endif}⇓
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---{$ifdef unix} FDS := Default(TFDSet); fpFD_Zero(FDS); fpFD_Set(FSocket, FDS); Result := fpSelect(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0;{$elseif defined(windows)} FDS := Default(TFDSet); FD_Zero(FDS); FD_Set(FSocket, FDS); Result := winsock2.Select(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0;{$endif}
Josh:
maybe
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function TSocketServer.RunIdleLoop: Boolean;// Run Accept idle loop. Return True if there is a new connection waiting{$if defined(unix) or defined(windows)}var FDS: TFDSet; TimeV: TTimeVal;{$endif}begin Repeat Result:=False; {$if defined(unix) or defined(windows)} TimeV.tv_usec := (AcceptIdleTimeout mod 1000) * 1000; TimeV.tv_sec := AcceptIdleTimeout div 1000; FDS := Default(TFDSet); {$ifdef unix} fpFD_Zero(FDS); fpFD_Set(FSocket, FDS); Result := fpSelect(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0; {$else} FD_Zero(FDS); FD_Set(FSocket, FDS); Result := winsock2.Select(FSocket + 1, @FDS, @FDS, @FDS, @TimeV) > 0; {$endif} {$endif} If Result then break; DoOnIdle; Until (Not FAccepting);end;
AlexTP:
Posted to https://gitlab.com/freepascal.org/fpc/source/-/issues/40351
Navigation
[0] Message Index