コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
ファイル: SubscribeOperator.cs プロジェクト: 6bee/CRA
 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();
     }
 }
コード例 #4
0
ファイル: ShuffleOperator.cs プロジェクト: nlebeck/CRA
 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);
         }
     }
 }
コード例 #5
0
        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();
            }
        }
コード例 #6
0
ファイル: SubscribeOperator.cs プロジェクト: 6bee/CRA
        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);
        }
コード例 #7
0
ファイル: ShuffleOperator.cs プロジェクト: nlebeck/CRA
        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);
            }
        }