how to prevent the dead lock
i make a small http web server , i found that the dead lock come out from the
"TBlockSocket.SendBuffer"
when i try to call this line and if client close the connection before finish
sent complete. i try to modify the code below , it looks work.
..but Do you have any guide for me ? My idea is correct or not
Thank you very much
Suparit
function TBlockSocket.SendBuffer(Buffer: TMemory; Length: Integer): Integer;
{$IFNDEF CIL}
var
x, y: integer;
l, r: integer;
p: Pointer;
maxloopcnt:integer; //++++spl
{$ENDIF}
begin
Result := 0;
if TestStopFlag then
Exit;
DoMonitor(True, Buffer, Length);
{$IFDEF CIL}
Result := synsock.Send(FSocket, Buffer, Length, 0);
{$ELSE}
l := Length;
maxloopcnt:=0;
//++ writeln(l);
x := 0;
while (x < l) do
begin
Inc(maxloopcnt,1);
//writeln('[TX]');//++++
//sleep(1); //+++reduce cpu load..
y := l - x; //prevent dead lock
if y > FSendMaxChunk then
y := FSendMaxChunk;
if y > 0 then
begin
LimitBandwidth(y, FMaxSendBandwidth, FNextsend);
p := IncPoint(Buffer, x);
r := synsock.Send(FSocket, p, y, MSG_NOSIGNAL);
SockCheck(r);
//writeln(FLastError);//++++
if FLastError = WSAEWOULDBLOCK then
begin
if CanWrite(FNonblockSendTimeout) then
begin
r := synsock.Send(FSocket, p, y, MSG_NOSIGNAL);
SockCheck(r);
end
else
FLastError := WSAETIMEDOUT;
end;
if FLastError <> 0 then
Break;
//writeln(r);//+++
//if client disconnect it will found -1
if (r<0) or (maxloopcnt>Length) then
begin
Break; //remove dead lock add...client disconnect before sent complete
writeln('client disconnect before sent buffer complete anti-dead lock');
end;
Inc(x, r);
Inc(Result, r);
Inc(FSendCounter, r);
DoStatus(HR_WriteCount, IntToStr(r));
end
else
break;
end;
{$ENDIF}
ExceptCheck;
//writeln(maxloopcnt);//++++
end;
---------------------------------
Pinpoint customers who are looking for what you sell. -------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
synalist-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synalist-public