private void mainLoop() { //James should draw up a network state machine diagram to model this mainLoop() function while (true) { if (isClient) { lock (_lock) { working = false; if (stop) { return; } } //here we assume that if we are in this state we can only possibly be receiving a network request NetworkRequest request = (NetworkRequest)receiveMessage(tcpClient); //Die if we failed to receive a message if (request == null) { lock (_lock) { working = false; } break; } lock (_lock) { eventQueue.Enqueue(request); doWork = true; } } while (doWork | !isClient) { bool sleep = false; NetworkRequest request = null; lock (_lock) { if (stop) { return; } if (workQueue.Count() > 0) { working = true; request = workQueue.Dequeue(); doWork = false; } else { working = false; sleep = true; } } if (sleep) { Thread.Sleep(100); continue; } handleWork(request); doWork = false; } } }
private void handleWork(NetworkRequest request) { Logger.Debug("ClientThread:handleWork"); if (this.guid.Equals(request.SourceGuid)) { //if sourceguid=this.guid: make a network request and go from there if (request is PushRequest) { processMyPushRequest((PushRequest)request); } else if (request is PullRequest) { processMyPullRequest((PullRequest)request); } else if (request is QueryRequest) { processMyQueryRequest((QueryRequest)request); } else if (request is PushIndexRequest) { processMyPushIndexRequest((PushIndexRequest)request); } else { //what kind of request is this? Logger.Warn("ClientThread:handleWork my request is not a known request instance"); } return; } else {//if sourceguid!=this.guid: receive or send the file requested if (request is PushRequest) { PushRequest pr = (PushRequest)request; sendMessage(tcpClient, new NetworkResponse(ResponseType.Yes, "", guid, request.SequenceNumber)); //readFileToDisk(pr.FileSize, Chunk.PathToChunk(pr)); string remoteGuid = request.SourceGuid.ToString(); //string path = Path.Combine(Node.GetBackupDirectory(), remoteGuid, remoteGuid+'_'+pr.ChunkNumber+.tar readFileToDisk(pr.FileSize, Chunk.PathToChunk(request.SourceGuid, 0, pr.ChunkNumber)); } else if (request is PullRequest) { PullRequest pr = (PullRequest) request; sendMessage(tcpClient, new NetworkResponse(ResponseType.Yes, "", guid, request.SequenceNumber)); writeFileToNetwork(Chunk.PathToChunk(pr)); } else if (request is QueryRequest) { QueryRequest qr = (QueryRequest)request; processRemoteQueryRequest(qr); } else if (request is PushIndexRequest) { processRemotePushIndexRequest((PushIndexRequest)request); } else { //what kind of request is this? Logger.Warn("ClientThread:handleWork remote request is not a known request instance"); } } }
public void EnqueueWork(NetworkRequest request) { lock (_lock) { /*if (!isClient) {*/ working = true; workQueue.Enqueue(request); /*}*/ } }
private void acceptFileTransfer(NetworkRequest request, string path) { //doWork = true //send affirmative response //enqueue request in work queue //this function should be called when this thread has received a message and that message has been dequeued. //if this function is called while this thread is in the wrong state, it will not do anything until a message is received or the socket closes. doWork = true; working = true; this.path = path; lock (_lock) { workQueue.Enqueue(request); } }