public void RunOneAsync(IHmeConnection connection) { HmeConnectionWrapper wrapper = connection as HmeConnectionWrapper; if (wrapper != null) { ThreadPool.QueueUserWorkItem(ProcessApplicationCommands, wrapper.HmeConnection); } }
public void AddHmeConnection(IHmeConnection connection) { lock (_connections) { ConnectionData connectionData = new ConnectionData(); connectionData.Driver = _driver; connectionData.CommandReceived = EventWaitHandle.OpenExisting(connection.CommandReceivedName); connectionData.EventReceived = EventWaitHandle.OpenExisting(connection.EventReceivedName); _connections.Add(connection, connectionData); } _connectionAdded.Set(); _driver.HandleEventsAsync(connection); }
public void HandleEventsAsync(IHmeConnection connection) { HmeConnectionWrapper wrapper = connection as HmeConnectionWrapper; if (wrapper != null) { ApplicationEventsData data = new ApplicationEventsData { DriverGuid = _thisGuid, ConnectionGuid = Guid.NewGuid() }; _connections.Add(data.ConnectionGuid, wrapper.HmeConnection); wrapper.HmeConnection.BeginHandleEvent(ApplicationEventsHandled, data); } }
private static void DispatchApplicationCommandsAndEvents() { List <WaitHandle> connectionWaitHandleList = new List <WaitHandle>(); List <IHmeConnection> runningConnections = new List <IHmeConnection>(); connectionWaitHandleList.Add(_connectionAdded); connectionWaitHandleList.Add(_connectionRemoved); WaitHandle[] connectionWaitHandles = connectionWaitHandleList.ToArray(); while (true) { int handleIndex = WaitHandle.WaitAny(connectionWaitHandles); // must clear collections during add and remove since // other threads may change the _applications collection // before we get a lock on the _applications field if (handleIndex == 0 || handleIndex == 1) { runningConnections.Clear(); connectionWaitHandleList.Clear(); connectionWaitHandleList.Add(_connectionAdded); connectionWaitHandleList.Add(_connectionRemoved); lock (_connections) { foreach (var entry in _connections) { connectionWaitHandleList.Add(entry.Value.CommandReceived); connectionWaitHandleList.Add(entry.Value.EventReceived); runningConnections.Add(entry.Key); } } connectionWaitHandles = connectionWaitHandleList.ToArray(); } else { // working on local copy of connections rather than member // in order to avoid races to get a lock on the _connections field int connectionIndex = (handleIndex - 2) / 2; IHmeConnection connection = runningConnections[connectionIndex]; ConnectionData connectionData = _connections[connection]; connectionData.Driver.RunOneAsync(connection); } } }
public void RunOneAsync(IHmeConnection connection) { _contract.RunOneAsync(Tivo.Has.AddInSideAdapters.IHmeConnectionAddInAdapter.ViewToContractAdapter(connection)); }
public void HandleEventsAsync(IHmeConnection connection) { _contract.HandleEventsAsync(Tivo.Has.AddInSideAdapters.IHmeConnectionAddInAdapter.ViewToContractAdapter(connection)); }