private async Task StartServer() { // Restore vertices on machine await RestoreVerticesAndConnections(); var server = new TcpListener(IPAddress.Parse(_address), _port); // Start listening for client requests. server.Start(); while (true) { Debug.WriteLine("Waiting for a connection... "); TcpClient client = server.AcceptTcpClient(); client.NoDelay = true; Debug.WriteLine("Connected!"); // Get a stream object for reading and writing Stream stream = _craClient.SecureStreamConnectionDescriptor.CreateSecureServer(client.GetStream()); // Handle a task message sent to the CRA instance CRATaskMessageType message = (CRATaskMessageType)stream.ReadInt32(); HandleCRATaskMessage(message, stream); } }
private void HandleCRATaskMessage(CRATaskMessageType message, Stream stream) { switch (message) { case CRATaskMessageType.LOAD_VERTEX: Task.Run(() => LoadVertex(stream)); break; case CRATaskMessageType.CONNECT_VERTEX_INITIATOR: Task.Run(() => ConnectVertex_Initiator(stream, false)); break; case CRATaskMessageType.CONNECT_VERTEX_RECEIVER: Task.Run(() => ConnectVertex_Receiver(stream, false)); break; case CRATaskMessageType.CONNECT_VERTEX_INITIATOR_REVERSE: Task.Run(() => ConnectVertex_Initiator(stream, true)); break; case CRATaskMessageType.CONNECT_VERTEX_RECEIVER_REVERSE: Task.Run(() => ConnectVertex_Receiver(stream, true)); break; default: Console.WriteLine("Unknown message type: " + message); break; } }
private async void StartProducerAfterTrigger(int outputIndex) { if (_outputs[outputIndex] as StreamEndpoint != null) { CRATaskMessageType message = (CRATaskMessageType)(await((StreamEndpoint)_outputs[outputIndex]).Stream.ReadInt32Async()); if (message == CRATaskMessageType.READY) { StartProducerIfReady(outputIndex); } } else { throw new InvalidCastException(); } }
private async void StartProducerAfterTrigger(int outputIndex) { if (_outputs[outputIndex] as StreamEndpoint != null) { CRATaskMessageType message = (CRATaskMessageType)(await((StreamEndpoint)_outputs[outputIndex]).Stream.ReadInt32Async()); if (message == CRATaskMessageType.READY) { StartProducerIfReady(outputIndex); } } else { bool isReceived = await((ObjectEndpoint)_outputs[outputIndex]).OwningOutputEndpoint.InputEndpoint.EndpointContent.OnReceivedReadyMessage(); if (isReceived) { ((ObjectEndpoint)_outputs[outputIndex]).OwningOutputEndpoint.InputEndpoint.EndpointContent.ReadyTrigger.Reset(); StartProducerIfReady(outputIndex); } } }
private async Task TryReuseReceiverStream(Stream stream) { try { CRATaskMessageType message = (CRATaskMessageType)(await stream.ReadInt32Async()); if (message == CRATaskMessageType.PING) { stream.WriteInt32(0); // Handle a task message sent to the CRA instance CRATaskMessageType newMessage = (CRATaskMessageType)stream.ReadInt32(); HandleCRATaskMessage(newMessage, (NetworkStream)stream); } else { stream.Close(); } } catch (Exception) { stream.Close(); } }
private async Task <bool> ContinueOrRelease() { bool[] releaseFlags = new bool[_outputs.Length]; for (int i = 0; i < releaseFlags.Length; i++) { releaseFlags[i] = false; } bool[] reuseFlags = new bool[_outputs.Length]; for (int i = 0; i < reuseFlags.Length; i++) { reuseFlags[i] = false; } for (int i = 0; i < _outputs.Length; i++) { if (_outputs[i] as StreamEndpoint != null) { CRATaskMessageType message = (CRATaskMessageType)(await((StreamEndpoint)_outputs[i]).Stream.ReadInt32Async()); if (message == CRATaskMessageType.READY) { reuseFlags[i] = true; } else if (message == CRATaskMessageType.RELEASE) { releaseFlags[i] = true; } else { throw new InvalidOperationException(); } } else { throw new InvalidCastException(); } } if (AreAllFlagsTrue(releaseFlags)) { foreach (string operatorId in _outputEndpointTriggerStatus.Keys) { _onCompletedOutputs[operatorId].Set(); } foreach (string operatorId in _inputEndpointTriggerStatus.Keys) { _onCompletedInputs[operatorId].Set(); } for (int i = 0; i < _inputs.Length; i++) { if (_inputs[i] as StreamEndpoint != null) { ((StreamEndpoint)_inputs[i]).Stream.WriteInt32((int)CRATaskMessageType.RELEASE); } else { ((ObjectEndpoint)_inputs[i]).ReleaseTrigger.Set(); } } } else { _isProduceIfReadyApplied = false; for (int i = 0; i < _outputs.Length; i++) { int currentIndex = i; Task.Run(() => ContinueProducerAfterTrigger(currentIndex)); } } return(true); }
private async Task <bool> isReleaseAcquired() { bool[] releaseFlags = new bool[_outputs.Length]; for (int i = 0; i < releaseFlags.Length; i++) { releaseFlags[i] = false; } bool[] reuseFlags = new bool[_outputs.Length]; for (int i = 0; i < reuseFlags.Length; i++) { reuseFlags[i] = false; } for (int i = 0; i < _outputs.Length; i++) { if (_outputs[i] as StreamEndpoint != null) { CRATaskMessageType message = (CRATaskMessageType)(await((StreamEndpoint)_outputs[i]).Stream.ReadInt32Async()); if (message == CRATaskMessageType.READY) { reuseFlags[i] = true; } else if (message == CRATaskMessageType.RELEASE) { releaseFlags[i] = true; } else { throw new InvalidOperationException(); } } else { int currentIndex = i; int receivedMessageType = Task.WaitAny(new Task <bool>[] { Task.Run(() => OnReceivedReadyMessage(currentIndex)), Task.Run(() => OnReceivedReleaseMessage(currentIndex)) }); if (receivedMessageType == 0) { reuseFlags[i] = true; } else { releaseFlags[i] = true; } } } if (AreAllFlagsTrue(releaseFlags)) { foreach (string operatorId in _inputEndpointTriggerStatus.Keys) { _onCompletedInputs[operatorId].Set(); } foreach (string operatorId in _secondaryInputEndpointTriggerStatus.Keys) { _onCompletedSecondaryInputs[operatorId].Set(); } foreach (string operatorId in _outputEndpointTriggerStatus.Keys) { _onCompletedOutputs[operatorId].Set(); } if (_inputs != null) { for (int i = 0; i < _inputs.Length; i++) { if (_inputs[i] as StreamEndpoint != null) { ((StreamEndpoint)_inputs[i]).Stream.WriteInt32((int)CRATaskMessageType.RELEASE); } else { ((ObjectEndpoint)_inputs[i]).ReleaseTrigger.Set(); } } } if (_secondaryInputs != null) { for (int i = 0; i < _secondaryInputs.Length; i++) { if (_secondaryInputs[i] as StreamEndpoint != null) { ((StreamEndpoint)_secondaryInputs[i]).Stream.WriteInt32((int)CRATaskMessageType.RELEASE); } else { ((ObjectEndpoint)_secondaryInputs[i]).ReleaseTrigger.Set(); } } } return(true); } else { return(false); } }