Browse Source

* update lNet to 0.5.5

git-svn-id: trunk@8202 -
Almindor 18 years ago
parent
commit
0fef52cce3

+ 3 - 3
utils/fppkg/lnet/lcommon.pp

@@ -132,7 +132,7 @@ var
   Tmp: string;
   TmpW: widestring;
 begin
-  Result := '[' + IntToStr(Ernum) + '] ';
+  Result := ' [' + IntToStr(Ernum) + ']: ';
   if USEUtf8 then begin
     SetLength(TmpW, MAX_ERROR);
     SetLength(TmpW, FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM or
@@ -149,7 +149,7 @@ begin
   end;
   if Length(Tmp) > 2 then
     Delete(Tmp, Length(Tmp)-1, 2);
-  Result := Tmp;
+  Result := Result + Tmp;
 end;
 
 {$ENDIF}
@@ -265,7 +265,7 @@ end;
 
 function LStrError(const Ernum: Longint; const UseUTF8: Boolean = False): string;
 begin
-  Result := '[' + IntToStr(Ernum) + '] ' + Errors.StrError(Ernum);
+  Result := ' [' + IntToStr(Ernum) + ']: ' + Errors.StrError(Ernum);
 end;
 
 function LSocketError: Longint;

+ 25 - 14
utils/fppkg/lnet/levents.pp

@@ -140,8 +140,8 @@ type
     FFreeRoot: TLHandle; // the root of "free" list if any
     FFreeIter: TLHandle; // the last of "free" list if any
     FInLoop: Boolean;
-    function GetTimeout: DWord; virtual;
-    procedure SetTimeout(const Value: DWord); virtual;
+    function GetTimeout: Integer; virtual;
+    procedure SetTimeout(const Value: Integer); virtual;
     function Bail(const msg: string; const Ernum: Integer): Boolean;
     procedure AddForFree(aHandle: TLHandle);
     procedure FreeHandles;
@@ -162,7 +162,7 @@ type
     procedure Clear;
     procedure AddRef;
     procedure DeleteRef;
-    property Timeout: DWord read GetTimeout write SetTimeout;
+    property Timeout: Integer read GetTimeout write SetTimeout;
     property OnError: TLEventerErrorEvent read FOnError write FOnError;
     property Count: Integer read FCount;
   end;
@@ -176,8 +176,8 @@ type
     FReadFDSet: TFDSet;
     FWriteFDSet: TFDSet;
     FErrorFDSet: TFDSet;
-    function GetTimeout: DWord; override;
-    procedure SetTimeout(const Value: DWord); override;
+    function GetTimeout: Integer; override;
+    procedure SetTimeout(const Value: Integer); override;
     procedure ClearSets;
    public
     constructor Create; override;
@@ -301,12 +301,12 @@ begin
   Clear;
 end;
 
-function TLEventer.GetTimeout: DWord;
+function TLEventer.GetTimeout: Integer;
 begin
   Result := 0;
 end;
 
-procedure TLEventer.SetTimeout(const Value: DWord);
+procedure TLEventer.SetTimeout(const Value: Integer);
 begin
 end;
 
@@ -314,7 +314,7 @@ function TLEventer.Bail(const msg: string; const Ernum: Integer): Boolean;
 begin
   Result := False; // always false, substitute for caller's result
   if Assigned(FOnError) then
-    FOnError(msg + '[' + IntToStr(Ernum) + ']: ' + LStrError(Ernum), Self);
+    FOnError(msg + LStrError(Ernum), Self);
 end;
 
 procedure TLEventer.AddForFree(aHandle: TLHandle);
@@ -467,15 +467,23 @@ begin
   FTimeout.tv_usec := 0;
 end;
 
-function TLSelectEventer.GetTimeout: DWord;
+function TLSelectEventer.GetTimeout: Integer;
 begin
-  Result := (FTimeout.tv_sec * 1000) + FTimeout.tv_usec;
+  if FTimeout.tv_sec < 0 then
+    Result := -1
+  else
+    Result := (FTimeout.tv_sec * 1000) + FTimeout.tv_usec;
 end;
 
-procedure TLSelectEventer.SetTimeout(const Value: DWord);
+procedure TLSelectEventer.SetTimeout(const Value: Integer);
 begin
-  FTimeout.tv_sec := Value div 1000;
-  FTimeout.tv_usec := Value mod 1000;
+  if Value >= 0 then begin
+    FTimeout.tv_sec := Value div 1000;
+    FTimeout.tv_usec := Value mod 1000;
+  end else begin
+    FTimeout.tv_sec := -1;
+    FTimeout.tv_usec := 0;
+  end;
 end;
 
 procedure TLSelectEventer.ClearSets;
@@ -522,7 +530,10 @@ begin
   end;
 
   TempTime := FTimeout;
-  n := fpSelect(MaxHandle + 1, @FReadFDSet, @FWriteFDSet, @FErrorFDSet, @TempTime);
+  if FTimeout.tv_sec >= 0 then
+    n := fpSelect(MaxHandle + 1, @FReadFDSet, @FWriteFDSet, @FErrorFDSet, @TempTime)
+  else
+    n := fpSelect(MaxHandle + 1, @FReadFDSet, @FWriteFDSet, @FErrorFDSet, nil);
   
   if n < 0 then
     Bail('Error on select', LSocketError);

+ 20 - 16
utils/fppkg/lnet/lnet.pp

@@ -1,4 +1,4 @@
-{ lNet v0.5.3
+{ lNet v0.5.5
 
   CopyRight (C) 2004-2006 Ales Katona
 
@@ -345,6 +345,7 @@ type
 
     function GetConnected: Boolean; override;
     function GetConnecting: Boolean;
+    function GetCount: Integer; override;
 
     procedure ConnectAction(aSocket: TLHandle); override;
     procedure AcceptAction(aSocket: TLHandle); override;
@@ -438,7 +439,7 @@ procedure TLSocket.LogError(const msg: string; const ernum: Integer);
 begin
   if Assigned(FOnError) then
     if ernum > 0 then
-      FOnError(Self, msg + '[' + IntToStr(ernum) + ']: ' + LStrError(ernum))
+      FOnError(Self, msg + LStrError(ernum))
     else
       FOnError(Self, msg);
 end;
@@ -545,16 +546,15 @@ begin
     Done := true;
     FHandle := fpSocket(AF_INET, FSocketType, FProtocol);
     if FHandle = INVALID_SOCKET then
-      Bail('Socket error', LSocketError);
+      Exit(Bail('Socket error', LSocketError));
     SetOptions;
     if FSocketType = SOCK_DGRAM then begin
       Arg := 1;
       if fpsetsockopt(FHandle, SOL_SOCKET, SO_BROADCAST, @Arg, Sizeof(Arg)) = SOCKET_ERROR then
-        Bail('SetSockOpt error', LSocketError);
+        Exit(Bail('SetSockOpt error', LSocketError));
     end;
     
     FillAddressInfo(FAddress, AF_INET, Address, aPort);
-
     FillAddressInfo(FPeerAddress, AF_INET, LADDR_BR, aPort);
 
     Result  :=  Done;
@@ -582,7 +582,7 @@ begin
       Result := true;
     if (FSocketType = SOCK_STREAM) and Result then
       if fpListen(FHandle, FListenBacklog) = SOCKET_ERROR then
-        Result  :=  Bail('Error on Listen', LSocketError)
+        Result := Bail('Error on Listen', LSocketError)
       else
         Result := true;
   end;
@@ -625,8 +625,10 @@ function TLSocket.Send(const aData; const aSize: Integer): Integer;
 begin
   Result := 0;
   if not FServerSocket then begin
-    if aSize <= 0 then
+    if aSize <= 0 then begin
       Bail('Send error: wrong size (Size <= 0)', -1);
+      Exit(0);
+    end;
 
     if CanSend then begin
       Result := DoSend(aData, aSize);
@@ -863,11 +865,11 @@ begin
 
   Result := FRootSock.SetupSocket(APort, LADDR_ANY);
   
-  FillAddressInfo(FRootSock.FPeerAddress, AF_INET, Address, aPort);
-
-  FRootSock.FConnected := true;
-  if Result then
+  if Result then begin
+    FillAddressInfo(FRootSock.FPeerAddress, AF_INET, Address, aPort);
+    FRootSock.FConnected := true;
     RegisterWithEventer;
+  end;
 end;
 
 function TLUdp.Listen(const APort: Word; const AIntf: string = LADDR_ANY): Boolean;
@@ -885,8 +887,8 @@ begin
   
     FRootSock.FConnected := True;
     RegisterWithEventer;
+    Result := True;
   end;
-  Result := FRootSock.Connected;
 end;
 
 function TLUdp.Bail(const msg: string): Boolean;
@@ -1114,10 +1116,7 @@ end;
 
 procedure TLTcp.IterReset;
 begin
-  if Assigned(FRootSock) and FRootSock.FServerSocket then
-    FIterator := FRootSock.NextSock
-  else
-    FIterator := FRootSock;
+  FIterator := FRootSock;
 end;
 
 procedure TLTcp.Disconnect;
@@ -1230,6 +1229,11 @@ begin
     Result := FRootSock.Connecting;
 end;
 
+function TLTcp.GetCount: Integer;
+begin
+  Result := FCount;
+end;
+
 function TLTcp.Get(var aData; const aSize: Integer; aSocket: TLSocket): Integer;
 begin
   Result := 0;

+ 12 - 9
utils/fppkg/lnet/sys/lepolleventer.inc

@@ -49,14 +49,17 @@ begin
   inherited Destroy;
 end;
 
-function TLEpollEventer.GetTimeout: DWord;
+function TLEpollEventer.GetTimeout: Integer;
 begin
-  Result := DWord(FTimeout);
+  Result := FTimeout;
 end;
 
-procedure TLEpollEventer.SetTimeout(const Value: DWord);
+procedure TLEpollEventer.SetTimeout(const Value: Integer);
 begin
-  FTimeout := cInt(Value);
+  if Value >= 0 then
+    FTimeout := Value
+  else
+    FTimeout := -1;
 end;
 
 procedure TLEpollEventer.HandleIgnoreRead(aHandle: TLHandle);
@@ -129,19 +132,19 @@ begin
   MasterChanges := epoll_wait(FEpollMasterFD, @MasterEvents[0], 2, FTimeout);
 
   if MasterChanges > 0 then begin
-    for i := 0 to MasterChanges-1 do
+    for i := 0 to MasterChanges - 1 do
       if MasterEvents[i].Data.fd = FEpollFD then
         Changes := epoll_wait(FEpollFD, @FEvents[0], FCount, 0)
       else
         ReadChanges := epoll_wait(FEpollReadFD, @FEventsRead[0], FCount, 0);
     if (Changes < 0) or (ReadChanges < 0) then
-      Bail('Error on epoll: ', LSocketError)
+      Bail('Error on epoll', LSocketError)
     else
       Result := Changes + ReadChanges > 0;
       
     if Result then begin
       FInLoop := True;
-      for i := 0 to Max(Changes, ReadChanges)-1 do begin
+      for i := 0 to Max(Changes, ReadChanges) - 1 do begin
         Temp := nil;
         if i < Changes then begin
           Temp := TLHandle(FEvents[i].data.ptr);
@@ -176,7 +179,7 @@ begin
           if  (not Temp.FDispose)
           and (FEvents[i].events and EPOLLERR = EPOLLERR) then
             if Assigned(Temp.FOnError) and not Temp.IgnoreError then
-              Temp.FOnError(Temp, 'Handle error: ' + LStrError(LSocketError));
+              Temp.FOnError(Temp, 'Handle error' + LStrError(LSocketError));
 
           if Temp.FDispose then
             AddForFree(Temp);
@@ -187,7 +190,7 @@ begin
         FreeHandles;
     end;
   end else if MasterChanges < 0 then
-    Bail('Error on epoll: ', LSocketError);
+    Bail('Error on epoll', LSocketError);
 end;
 
 function BestEventerClass: TLEventerClass;

+ 2 - 2
utils/fppkg/lnet/sys/lepolleventerh.inc

@@ -18,8 +18,8 @@
     FEpollFD: THandle;       // this one monitors ET style for other
     FEpollMasterFD: THandle; // this one monitors the first two
     FFreeList: TFPObjectList;
-    function GetTimeout: DWord; override;
-    procedure SetTimeout(const Value: DWord); override;
+    function GetTimeout: Integer; override;
+    procedure SetTimeout(const Value: Integer); override;
     procedure HandleIgnoreRead(aHandle: TLHandle); override;
     procedure Inflate;
    public

+ 17 - 7
utils/fppkg/lnet/sys/lkqueueeventer.inc

@@ -22,15 +22,20 @@ begin
   inherited Destroy;
 end;
 
-function TLKQueueEventer.GetTimeout: DWord;
+function TLKQueueEventer.GetTimeout: Integer;
 begin
   Result := FTimeout.tv_sec + FTimeout.tv_nsec * 1000 * 1000;
 end;
 
-procedure TLKQueueEventer.SetTimeout(const Value: DWord);
+procedure TLKQueueEventer.SetTimeout(const Value: Integer);
 begin
-  FTimeout.tv_sec := Value div 1000;
-  FTimeout.tv_nsec := (Value mod 1000) * 1000;
+  if Value >= 0 then begin
+    FTimeout.tv_sec := Value div 1000;
+    FTimeout.tv_nsec := (Value mod 1000) * 1000;
+  end else begin
+    FTimeout.tv_sec := -1;
+    FTimeout.tv_nsec := 0;
+  end;
 end;
 
 procedure TLKQueueEventer.HandleIgnoreRead(aHandle: TLHandle);
@@ -85,11 +90,16 @@ var
   i, n: Integer;
   Temp: TLHandle;
 begin
-  n := KEvent(FQueue, @FChanges[0], FFreeSlot,
-            @FEvents[0], Length(FEvents), @FTimeout);
+  if FTimeout.tv_sec >= 0 then
+    n := KEvent(FQueue, @FChanges[0], FFreeSlot,
+              @FEvents[0], Length(FEvents), @FTimeout)
+  else
+    n := KEvent(FQueue, @FChanges[0], FFreeSlot,
+              @FEvents[0], Length(FEvents), nil);
+
   FFreeSlot := 0;
   if n < 0 then
-    Bail('Error on kqueue: ', LSocketError);
+    Bail('Error on kqueue', LSocketError);
   Result := n > 0;
   if Result then begin
     FInLoop := True;

+ 2 - 2
utils/fppkg/lnet/sys/lkqueueeventerh.inc

@@ -11,8 +11,8 @@
     FChanges: array of TKEvent;
     FFreeSlot: Integer;
     FQueue: THandle;
-    function GetTimeout: DWord; override;
-    procedure SetTimeout(const Value: DWord); override;
+    function GetTimeout: Integer; override;
+    procedure SetTimeout(const Value: Integer); override;
     procedure HandleIgnoreRead(aHandle: TLHandle); override;
     procedure Inflate;
    public