En/na Luca Olivetti ha escrit:
Show quoted text 15 lines
En/na L ha escrit:
>> Found the problem using my brute force writeln('') skills. It is an
>> issue with freepascal's stack or something to do with buggy threads
>> methinks. As it is when you call lasterror within another procedure
>> with local variables.. they are corrupted or something.
>>
> Aha.. I changed the by Value parameter to a CONST parameter in the
> error procedure (Perror).. And this solves the issue..
>
> So something to do with calling by Value within a thread versus a
> const (pointer?).
This seriously worries me, since I use threads extensively, and I mostly
use call by value parameters.
I finally had time to test this (do you remember that dilber strip where he asks his PHB which one of the 3 projects he's juggling should be finished on schedule, and the PHB replies he should finish them all on schedule? well, I'm pretty much in the same situation now). Changing my "procedure PError(msg:string)" to "procedure PError(const msg:string)" in TSocketThread.Execute in project2 also fixes the problem. This smells like a bug somewhere in fpc/rtl, since I don't think it should make a difference.
Anyway, this gives me no clue on how to "fix" synapse. Synapse does this:
function TBlockSocket.SockCheck(SockResult: Integer): Integer;
begin
ResetLastError;
if SockResult = integer(SOCKET_ERROR) then
begin
FLastError := synsock.WSAGetLastError;
FLastErrorDesc := GetErrorDescEx;
end;
Result := FLastError;
end;
then in a connect it wraps the connect call in SockCheck:
procedure TBlockSocket.Connect(IP, Port: string);
var
Sin: TVarSin;
begin
SetSin(Sin, IP, Port);
if FLastError = 0 then
begin
if FSocket = INVALID_SOCKET then
InternalCreateSocket(Sin);
SockCheck(synsock.Connect(FSocket, Sin));
if FLastError = 0 then
GetSins;
FBuffer := '';
FLastCR := False;
FLastLF := False;
end;
ExceptCheck;
DoStatus(HR_Connect, IP + ':' + Port);
end;
Changing
function TBlockSocket.SockCheck(SockResult: Integer): Integer;
to
function TBlockSocket.SockCheck(const SockResult: Integer): Integer;
does nothing.
Moreover, something really fishy is going on: look at the attached project4 (now using synapse).
First I try outside a thread, and it correctly reports error 10060, then inside a thread, where it reports 0, then again outside the thread (same procedure) and this time it reports 0!
What's going on?
Bye
Luca