public Joiner(INode i, IReaderWriter readerWriter, IRecon recon, IMessageHub messageHub) { this.i = i; this.messageHub = messageHub; eventHandlers = new EventHandlerList(); status = new ObservableAtomicValue <NodeStatus>(NodeStatus.Idle); reconStatus = new ObservableAtomicValue <NodeStatus>(NodeStatus.Idle); rwStatus = new ObservableAtomicValue <NodeStatus>(NodeStatus.Idle); hints = new ObservableAtomicValue <IEnumerable <INode> >(Enumerable.Empty <INode>()); preJoinRw = new ObservableCondition(() => status.Get() == NodeStatus.Joining && rwStatus.Get() == NodeStatus.Idle, new[] { status, rwStatus }); preJoinRecon = new ObservableCondition(() => status.Get() == NodeStatus.Joining && reconStatus.Get() == NodeStatus.Idle, new[] { status, reconStatus }); preJoin = new ObservableCondition(() => status.Get() == NodeStatus.Joining, new[] { status }); preJoinAck = new ObservableCondition(() => status.Get() == NodeStatus.Joining && rwStatus.Get() == NodeStatus.Active && reconStatus.Get() == NodeStatus.Active, new[] { status, rwStatus, reconStatus }); this.recon = recon; this.recon.JoinAck += JoinAckReaderWriter; this.readerWriter = readerWriter; this.readerWriter.JoinAck += JoinAckRecon; new Thread(OutJoinRw).Start(); new Thread(OutJoinRecon).Start(); new Thread(OutSend).Start(); new Thread(OutJoinAck).Start(); }
public Rambo(INode creator, IMessageHub messageHub, IEnumerable <IConfiguration> initialConfig, IMessageSerializer messageSerializer) { Contract.Requires(creator != null); Contract.Requires(messageHub != null); Contract.Requires(messageHub != null); Contract.Requires(initialConfig != null && initialConfig.Any()); Node = creator; eventHandlers = new EventHandlerList(); readerWriter = new ReaderWriter(creator, messageHub, initialConfig, messageSerializer); recon = new Recon(); joiner = new Joiner(creator, readerWriter, recon, messageHub); ConfigureService(); }