private void InitializeConnectData(NamedPipeConnectData connectData)
        {
            connectData._are         = new AutoResetEvent(false);
            connectData._pipe        = CreateNamedPipe(connectData._pipeName);
            connectData._overlapped  = new Overlapped(0, 0, connectData._are.SafeWaitHandle.DangerousGetHandle(), null);
            connectData._isConnected = Native.ConnectNamedPipe(connectData._pipe.DangerousGetHandle(), connectData._overlapped);

            if (!connectData._isConnected && Native.GetLastError() == Native.ERROR_PIPE_CONNECTED)
            {
                connectData._isConnected = true;
            }
        }
示例#2
0
        private void InitializeConnectData(NamedPipeConnectData connectData)
        {
            connectData._are = new AutoResetEvent(false);
            connectData._pipe = CreateNamedPipe(connectData._pipeName);
            connectData._overlapped = new Overlapped(0, 0, connectData._are.SafeWaitHandle.DangerousGetHandle(), null);
            connectData._isConnected = Native.ConnectNamedPipe(connectData._pipe.DangerousGetHandle(), connectData._overlapped);

            if (!connectData._isConnected && Native.GetLastError() == Native.ERROR_PIPE_CONNECTED)
            {
                connectData._isConnected = true;
            }
        }
        private int FindConnectDataIndex(ComPortHandle handle)
        {
            for (int i = 0; i < _connectData.Length; i++)
            {
                NamedPipeConnectData connectData = _connectData[i];

                if (connectData != null && connectData._comPortHandle == handle)
                {
                    return(i);
                }
            }

            return(-1);
        }
        private void ConnectToClients()
        {
            VerifyAccess();

            for (int iPort = 0; iPort < _connectData.Length; iPort++)
            {
                NamedPipeConnectData connectData = _connectData[iPort];

                if (connectData != null && connectData._isConnected && !connectData._isRegistered)
                {
                    RegisterNamedPipePort(connectData);
                }
            }
        }
        private void PipeServerThreadProc()
        {
            int shutdownHandleIndex = _connectData.Length;
            int moreClientsIndex    = shutdownHandleIndex + 1;

            WaitHandle[] handles = new WaitHandle[moreClientsIndex + 1];

            handles[shutdownHandleIndex] = this.Emulator.ShutdownHandle;
            handles[moreClientsIndex]    = _areClients;

            while (true)
            {
                lock (this)
                {
                    for (int iPort = 0; iPort < shutdownHandleIndex; iPort++)
                    {
                        NamedPipeConnectData connectData = _connectData[iPort];

                        handles[iPort] = connectData._are;
                    }
                }

                int waitResult = WaitHandle.WaitAny(handles);

                if (waitResult == shutdownHandleIndex)
                {
                    //Shutdown
                    break;
                }

                if (waitResult < shutdownHandleIndex)
                {
                    _connectData[waitResult]._isConnected = true;

                    this.Emulator.BeginInvoke(
                        delegate
                    {
                        ConnectToClients();
                    }
                        );
                }
            }
        }
        private void RegisterNamedPipePort(NamedPipeConnectData connectData)
        {
            VerifyAccess();

            AsyncFileStream stream = new AsyncFileStream(connectData._pipeName, connectData._pipe);

            ComPortToNamedPipe namedPipePort = new ComPortToNamedPipe(connectData._pipeName, stream);

            namedPipePort.ComPortHandle = connectData._comPortHandle;

            this.Emulator.RegisterComponent(namedPipePort);

            connectData._isRegistered = true;

            //The TinyCLR doesn't call Initialize for the debug NamedPipe ports always
            //and we are swapping out components anyway, so we need to force the
            //initialization here to start the reading
            namedPipePort.DeviceInitialize();
        }
示例#7
0
        public void RegisterNamedPipe( string pipeName, ComPortHandle handle )
        {
            Debug.Assert( FindConnectDataIndex( handle ) == -1 );
            Debug.Assert(this.Emulator.State < Emulator.EmulatorState.Initialize); 
            //thread safety??

            NamedPipeConnectData connectData = new NamedPipeConnectData();

            connectData._comPortHandle = handle;
            connectData._pipeName = pipeName;

            InitializeConnectData( connectData );

            NamedPipeConnectData[] connectDataNew = new NamedPipeConnectData[_connectData.Length + 1];
            Array.Copy( _connectData, connectDataNew, _connectData.Length );

            connectDataNew[_connectData.Length] = connectData;

            _connectData = connectDataNew;

            _areClients.Set();
        }
        public void RegisterNamedPipe(string pipeName, ComPortHandle handle)
        {
            Debug.Assert(FindConnectDataIndex(handle) == -1);
            Debug.Assert(this.Emulator.State < Emulator.EmulatorState.Initialize);
            //thread safety??

            NamedPipeConnectData connectData = new NamedPipeConnectData();

            connectData._comPortHandle = handle;
            connectData._pipeName      = pipeName;

            InitializeConnectData(connectData);

            NamedPipeConnectData[] connectDataNew = new NamedPipeConnectData[_connectData.Length + 1];
            Array.Copy(_connectData, connectDataNew, _connectData.Length);

            connectDataNew[_connectData.Length] = connectData;

            _connectData = connectDataNew;

            _areClients.Set();
        }
        private void UnregisterNamedPipePort(ComPort port)
        {
            VerifyAccess();

            int idx = FindConnectDataIndex(port.ComPortHandle);

            if (idx != -1)
            {
                NamedPipeConnectData connectData = _connectData[idx];

                Debug.Assert(connectData._isConnected);

                connectData._isRegistered = false;
                connectData._isConnected  = false;
                connectData._pipe.Dispose();

                //reset connectdata
                InitializeConnectData(connectData);

                port.DeviceUninitialize();

                _areClients.Set();
            }
        }
示例#10
0
        private void RegisterNamedPipePort(NamedPipeConnectData connectData)
        {
            VerifyAccess();

            AsyncFileStream stream = new AsyncFileStream(connectData._pipeName, connectData._pipe);

            ComPortToNamedPipe namedPipePort = new ComPortToNamedPipe(connectData._pipeName, stream);

            namedPipePort.ComPortHandle = connectData._comPortHandle;

            this.Emulator.RegisterComponent(namedPipePort);

            connectData._isRegistered = true;

            //The TinyCLR doesn't call Initialize for the debug NamedPipe ports always
            //and we are swapping out components anyway, so we need to force the
            //initialization here to start the reading
            namedPipePort.DeviceInitialize();
        }