private List <PeerInfo> signalHandlerThreads(List <PeerInfo> waiters) { var deadWaiters = new List <PeerInfo>(); foreach (PeerInfo waiter in waiters) { // TODO: optimize in evening in case if waiter is current instanse EventWaitHandle notifier; bool alive = MutextHelper.TryOpenExistingEventWaitHandle(waiter.WaiterName, out notifier); if (alive) { EventWaitHandle responder; MutextHelper.TryOpenExistingEventWaitHandle(waiter.ResponderName, out responder); notifier.Set(); try { responder.WaitOne(_peerResponce); } catch (AbandonedMutexException)//peer crashed without Disposing { deadWaiters.Add(waiter); } } else { deadWaiters.Add(waiter); // peer was closed without Disposing } } return(deadWaiters); }
public LocalInterProcessEvent(string name) { _name = name; _readerWriterLock = MutextHelper.AttachToMutex(_name + "Peer2Peer.ReaderWriter"); _me = new LocalPeer(name); _eventWaitersRegistry = new MemoryMappedFileChannel(_name + "Peer2Peer.Registry", MAX_BYTES); _eventData = new MemoryMappedFileChannel(_name + "Peer2Peer.Data", MAX_BYTES); }
public LocalPeer(string eventName) { PeerId = string.Format("event:{0},class:{1},pid:{2},appdomain:{3}", eventName, this.GetType().Name, Process.GetCurrentProcess().Id, AppDomain.CurrentDomain.Id); WaiterName = PeerId + " Waiter"; Waiter = MutextHelper.AttachToEventWaitHandle(WaiterName, EventResetMode.AutoReset); ResponderName = PeerId + " Responder"; Responder = MutextHelper.AttachToEventWaitHandle(ResponderName, EventResetMode.AutoReset); }