コード例 #1
0
ファイル: MessageBroker.cs プロジェクト: epeshk/rd
        private void Invoke(IRdReactive reactive, byte[] msg, bool sync = false)
        {
            if (sync)
            {
                Execute(reactive, msg);
                return;
            }

            reactive.WireScheduler.Queue(() =>
            {
                bool shouldProcess;
                lock (myLock)
                {
                    shouldProcess = mySubscriptions.ContainsKey(reactive.RdId);
                }

                if (shouldProcess)
                {
                    Execute(reactive, msg);
                }
                else
                {
                    myLogger.Trace("Handler for entity {0} dissapeared", reactive);
                }
            });
        }
コード例 #2
0
ファイル: MessageBroker.cs プロジェクト: epeshk/rd
        public void Advise(Lifetime lifetime, IRdReactive reactive)
        {
            Assertion.Require(!reactive.RdId.IsNil, "!id.IsNil: {0}", reactive);

            myScheduler.AssertThread(reactive);

            // ReSharper disable once InconsistentlySynchronizedField
            mySubscriptions.BlockingAddUnique(lifetime, myLock, reactive.RdId, reactive);

            if (reactive.WireScheduler.OutOfOrderExecution)
            {
                lifetime.TryExecute(() =>
                {
                    lock (myLock) {
                        if (myBroker.TryGetValue(reactive.RdId, out var mq))
                        {
                            myBroker.Remove(reactive.RdId);
                            foreach (var msg in mq.DefaultSchedulerMessages)
                            {
                                Invoke(reactive, msg);
                            }

                            mq.DefaultSchedulerMessages.Clear(); // clear it here because it is captured by default scheduler queueing
                            Assertion.Assert(mq.CustomSchedulerMessages.Count == 0, "Custom scheduler messages for an entity with outOfOrder scheduler {0}", reactive);
                        }
                    }
                });
            }
        }
コード例 #3
0
        public WiredLifetime(LifetimeDefinition definition, RdId rdId, IRdReactive parent, IWire wire)
        {
            myDefinition  = definition;
            myParent      = parent;
            RdId          = rdId;
            WireScheduler = parent.WireScheduler; //maybe cancellation better to do synchronous

            wire.Advise(definition.Lifetime, this);
        }
コード例 #4
0
ファイル: MessageBroker.cs プロジェクト: epeshk/rd
        private static unsafe void Execute(IRdReactive reactive, byte[] msg)
        {
            fixed(byte *p = msg)
            {
                var reader = UnsafeReader.CreateReader(p, msg.Length);
                var rdid0  = RdId.Read(reader);

                Assertion.Assert(reactive.RdId.Equals(rdid0), "Not equals: {0}, {1}", reactive.RdId, rdid0);

                reactive.OnWireReceived(reader);
            }
        }
コード例 #5
0
 public void Advise(Lifetime lifetime, IRdReactive reactive)
 {
   MessageBroker.Advise(lifetime, reactive);
 }    
コード例 #6
0
 public void Advise(Lifetime lifetime, IRdReactive entity)
 {
     RealWire.Advise(lifetime, entity);
 }