Under load, I'm noticing our RTSP server occasionally hangs in this location:
static int blockUntilReadable(UsageEnvironment& env,
int socket, struct timeval* timeout) {
int result = -1;
do {
fd_set rd_set;
FD_ZERO(&rd_set);
if (socket < 0) break;
FD_SET((unsigned) socket, &rd_set);
const unsigned numFds = socket+1;
result = select(numFds, &rd_set, NULL, NULL, timeout); <--HANG
You know what? Now that we have fixed "RTSPClient" so that we no
longer do any synchronous socket reads - i.e., we now read from a
socket only when we're notified from the event queue that new data is
available on the socket - we should no longer ever need to call
"blockUntilReadable()" at all!
I.e., you should be able to remove the following code from the
implementation of "readSocket()" in "groupsock/GroupsockHelper.cpp"
(line 265):
int result = blockUntilReadable(env, socket, timeout);
if (timeout != NULL && result == 0) {
bytesRead = 0;
break;
} else if (result <= 0) {
break;
}
and I think everything will work OK (only more efficiently!).
So give this a try. If you run into any problems, let us know. (If
not, I'll remove this code from the next release of the software.)
--
Ross Finlayson
Live Networks, Inc.
http://www.live555.com/
_______________________________________________
live-devel mailing list
live-devel@lists.live555.com
http://lists.live555.com/mailman/listinfo/live-devel