Пример #1
0
        public void RunOneAsync(IHmeConnection connection)
        {
            HmeConnectionWrapper wrapper = connection as HmeConnectionWrapper;

            if (wrapper != null)
            {
                ThreadPool.QueueUserWorkItem(ProcessApplicationCommands, wrapper.HmeConnection);
            }
        }
Пример #2
0
 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);
 }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
                }
            }
        }
Пример #5
0
 public void RunOneAsync(IHmeConnection connection)
 {
     _contract.RunOneAsync(Tivo.Has.AddInSideAdapters.IHmeConnectionAddInAdapter.ViewToContractAdapter(connection));
 }
Пример #6
0
 public void HandleEventsAsync(IHmeConnection connection)
 {
     _contract.HandleEventsAsync(Tivo.Has.AddInSideAdapters.IHmeConnectionAddInAdapter.ViewToContractAdapter(connection));
 }