X-Git-Url: https://git.ucc.asn.au/?p=progcomp2012.git;a=blobdiff_plain;f=judge%2Fmanager%2Fnetwork.cpp;h=74929a7b0f5547b851769a11a1a2838deb67c32e;hp=e349fea4cabfb85749929a7918cd0951189105a3;hb=ac335e7c423d067effae82cc80db518f896271b9;hpb=341297b4dce9528d54fe9dceeff0d6dc33f70abe diff --git a/judge/manager/network.cpp b/judge/manager/network.cpp index e349fea..74929a7 100644 --- a/judge/manager/network.cpp +++ b/judge/manager/network.cpp @@ -150,6 +150,31 @@ bool Network::GetMessage(string & buffer, double timeout) setbuf(file, NULL); } + struct timeval tv; + fd_set readfds; + + tv.tv_sec = (int)(timeout); + tv.tv_usec = (timeout - (double)((int)timeout)) * 1000000; + + FD_ZERO(&readfds); + FD_SET(sfd, &readfds); + + select(sfd+1, &readfds, NULL, NULL, &tv); + + if (!FD_ISSET(sfd, &readfds)) + return false; //Timed out + //fprintf(stderr, "Got message!\n"); + for (char c = fgetc(file); c != '\n' && (int)(c) != EOF; c = fgetc(file)) + { + //fprintf(stderr, "%c", c); + buffer += c; + } + //fprintf(stderr, "%s\n", buffer.c_str()); + return true; + + + /* Old way, which is apparently terrible + assert(&buffer != NULL); GetterThread getterThread(file, buffer); assert(&(getterThread.buffer) != NULL); @@ -180,6 +205,7 @@ bool Network::GetMessage(string & buffer, double timeout) if (buffer.size() == 1 && buffer[0] == EOF) return false; return true; + */ }