connection = c; // TOFIX: 'incref c' doesn't work
incref connection; // HTTPFile reference if we keep it
connectionsMutex.Release();
+ connection.OnReceive = Socket::OnReceive;
connection.ProcessTimeOut(0.000001);
connectionsMutex.Wait();
if(!connection.connected || connection.file)
// ::PrintLn("Sending GET for ", name, " ", (uint64)this, " in thread ", GetCurrentThreadID(), "\n");
connection.Send(msg, len);
- while(this.connection && this.connection.connected && !done)
{
- this.connection.Process();
+ Time startTime = GetTime();
+ while(this.connection && this.connection.connected && !done)
+ {
+ //this.connection.Process();
+ if(!this.connection.ProcessTimeOut(5) || GetTime() - startTime > 5)
+ {
+ status = 0;
+ break;
+ }
+ }
}
//::PrintLn("Got DONE for ", name, " ", (uint64)this, " in thread ", GetCurrentThreadID(), "\n");
// First time check if we already have bytes, second time wait for an event
connection.Process();
if(wait && bufferCount - bufferPos == 0 && GetTime() - lastTime > 5)
+ {
+ connection.Disconnect(remoteClosed);
eof = true;
+ }
wait = true;
}
}
int count = 0;
result = true;
- if((int)recvBufferSize - recvBytes < MAX_RECEIVE)
+ if(!leftOver)
{
- recvBuffer = renew recvBuffer byte[recvBufferSize + MAX_RECEIVE];
- recvBufferSize += MAX_RECEIVE;
- }
-
- if(FD_ISSET(s, rs) && disconnectCode == (DisconnectCode)-1)
- {
- if(type == tcp /*|| _connected*/)
- count = ReceiveData(recvBuffer + recvBytes, recvBufferSize - recvBytes, 0);
- else
+ if((int)recvBufferSize - recvBytes < MAX_RECEIVE)
{
- SOCKLEN_TYPE len = sizeof(a);
- count = (int)recvfrom(s, (char *)recvBuffer + recvBytes,
- recvBufferSize - recvBytes, 0, (SOCKADDR *)&a, &len);
- strcpy(inetAddress, inet_ntoa(this.a.sin_addr));
- inetPort = ntohs((uint16)a.sin_port);
+ recvBuffer = renew recvBuffer byte[recvBufferSize + MAX_RECEIVE];
+ recvBufferSize += MAX_RECEIVE;
}
- switch(count)
+
+ if(FD_ISSET(s, rs) && disconnectCode == (DisconnectCode)-1)
{
- case 0:
- disconnectCode = remoteClosed;
- break;
- case -1:
+ if(type == tcp /*|| _connected*/)
+ count = ReceiveData(recvBuffer + recvBytes, recvBufferSize - recvBytes, 0);
+ else
{
- /*int yo = errno;
- printf("Errno is %d", errno);*/
- disconnectCode = remoteLost;
- break;
+ SOCKLEN_TYPE len = sizeof(a);
+ count = (int)recvfrom(s, (char *)recvBuffer + recvBytes,
+ recvBufferSize - recvBytes, 0, (SOCKADDR *)&a, &len);
+ strcpy(inetAddress, inet_ntoa(this.a.sin_addr));
+ inetPort = ntohs((uint16)a.sin_port);
+ }
+ switch(count)
+ {
+ case 0:
+ disconnectCode = remoteClosed;
+ break;
+ case -1:
+ {
+ /*int yo = errno;
+ printf("Errno is %d", errno);*/
+ disconnectCode = remoteLost;
+ break;
+ }
}
}
}
fd_set rs, ws, es;
int selectResult;
Mutex mutex;
+ bool deleteMutex = false;
+ bool leftOver;
+
+ mutex = this.mutex;
+ mutex.Wait();
+ incref this;
- if(disconnectCode > 0 && !leftOver) return false;
+ leftOver = this.leftOver;
+ if(disconnectCode > 0 && !leftOver)
+ {
+ if(_refCount == 1)
+ {
+ deleteMutex = true;
+ this.mutex = null;
+ }
+ delete this;
+ mutex.Release();
+ if(deleteMutex)
+ delete mutex;
+ return false;
+ }
FD_ZERO(&rs);
FD_ZERO(&ws);
FD_ZERO(&es);
//FD_SET(s, &ws);
FD_SET(s, &es);
- mutex = this.mutex;
- mutex.Wait();
- incref this;
mutex.Release();
selectResult = select((int)(s+1), &rs, &ws, &es, leftOver ? &tv : (timeOut ? &tvTO : null));
gotEvent |= ProcessSocket(&rs, &ws, &es);
}
mutex.Wait();
- this.mutex = null;
+ if(_refCount == 1)
+ {
+ deleteMutex = true;
+ this.mutex = null;
+ }
delete this;
mutex.Release();
- delete mutex;
+ if(deleteMutex)
+ delete mutex;
return gotEvent;
}