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(); }
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(); } }