internal static OperationResult <InboundChannel> Open(string fullName, string name) { Semaphore readerSemaphore = null; MemoryMappedFile file = null; Semaphore exclusiveAccessSemaphore = null; EventWaitHandle hasMessagesEvent = null; EventWaitHandle noMessagesEvent = null; EventWaitHandle clientConnectedEvent = null; try { var readerSemaphoreOperationResult = LifecycleHelper.OpenAndSetReaderSemaphore(fullName); if (readerSemaphoreOperationResult.Status != OperationStatus.Completed) { return(new OperationResult <InboundChannel>(readerSemaphoreOperationResult.Status, null)); } readerSemaphore = readerSemaphoreOperationResult.Data; var openCommonSharedObjectsStatus = LifecycleHelper.OpenCommonSharedObjects(fullName, out file, out exclusiveAccessSemaphore, out hasMessagesEvent, out noMessagesEvent, out clientConnectedEvent); if (openCommonSharedObjectsStatus != OperationStatus.Completed) { try { readerSemaphore.Release(); } catch { } LifecycleHelper.PlatformSpecificDispose(readerSemaphore); } var result = new InboundChannel(name, readerSemaphore, exclusiveAccessSemaphore, file, hasMessagesEvent, noMessagesEvent, clientConnectedEvent, null); return(new OperationResult <InboundChannel>(OperationStatus.Completed, result)); } catch { if (readerSemaphore != null) { try { readerSemaphore.Release(); } catch { } LifecycleHelper.PlatformSpecificDispose(readerSemaphore); } LifecycleHelper.PlatformSpecificDispose(exclusiveAccessSemaphore); file?.Dispose(); LifecycleHelper.PlatformSpecificDispose(hasMessagesEvent); LifecycleHelper.PlatformSpecificDispose(noMessagesEvent); LifecycleHelper.PlatformSpecificDispose(clientConnectedEvent); throw; } }
protected virtual void Dispose(bool disposing) { if (!_isDisposed) { _isDisposed = true; if (disposing) { if (_isClient) { try { _clientConnectedEvent.Reset(); } catch { } } LifecycleHelper.PlatformSpecificDispose(_clientConnectedEvent); _clientConnectedEvent = null; LifecycleHelper.PlatformSpecificDispose(_readerSemaphore); _readerSemaphore = null; LifecycleHelper.PlatformSpecificDispose(_writerSemaphore); _writerSemaphore = null; LifecycleHelper.PlatformSpecificDispose(_exclusiveAccessSemaphore); _exclusiveAccessSemaphore = null; LifecycleHelper.PlatformSpecificDispose(_hasMessagesEvent); _hasMessagesEvent = null; LifecycleHelper.PlatformSpecificDispose(_noMessagesEvent); _noMessagesEvent = null; _memoryManager?.Dispose(); _memoryManager = null; } } }
protected override void OnActivated(IActivatedEventArgs args) { base.OnActivated(args); var protocolArgs = args as ProtocolActivatedEventArgs; LifecycleHelper.FacebookAuthenticationReceived(protocolArgs); }
internal static OperationResult <OutboundChannel> Create(string fullName, string name, long capacity, Acl acl) { Semaphore writerSemaphore = null; MemoryMappedFile file = null; Semaphore exclusiveAccessSemaphore = null; EventWaitHandle hasMessagesEvent = null; EventWaitHandle noMessagesEvent = null; EventWaitHandle clientConnectedEvent = null; Semaphore readerSemaphore = null; try { var writerSemaphoreOperationResult = LifecycleHelper.CreateAndSetWriterSemaphore(fullName, acl); if (writerSemaphoreOperationResult.Status != OperationStatus.Completed) { return(new OperationResult <OutboundChannel>(writerSemaphoreOperationResult.Status, null)); } writerSemaphore = writerSemaphoreOperationResult.Data; var fileOperationResult = LifecycleHelper.CreateMemoryMappedFile(fullName, capacity, acl); if (fileOperationResult.Status != OperationStatus.Completed && fileOperationResult.Status != OperationStatus.ObjectAlreadyInUse) { try { writerSemaphore.Release(); } catch { } LifecycleHelper.PlatformSpecificDispose(writerSemaphore); return(new OperationResult <OutboundChannel>(fileOperationResult.Status, null)); } file = fileOperationResult.Data; exclusiveAccessSemaphore = LifecycleHelper.CreateExclusiveAccessSemaphore(fullName, acl); hasMessagesEvent = LifecycleHelper.CreateHasMessagesEvent(fullName, acl); noMessagesEvent = LifecycleHelper.CreateNoMessagesEvent(fullName, acl); clientConnectedEvent = LifecycleHelper.CreateClientConnectedEvent(fullName, acl); readerSemaphore = LifecycleHelper.CreateReaderSemaphore(fullName, acl); OutboundChannel result; if (fileOperationResult.Status == OperationStatus.ObjectAlreadyInUse) { result = new OutboundChannel(name, writerSemaphore, file, exclusiveAccessSemaphore, hasMessagesEvent, noMessagesEvent, clientConnectedEvent, readerSemaphore); } else { result = new OutboundChannel(name, writerSemaphore, file, capacity, exclusiveAccessSemaphore, hasMessagesEvent, noMessagesEvent, clientConnectedEvent, readerSemaphore); } return(new OperationResult <OutboundChannel>(OperationStatus.Completed, result)); } catch { if (writerSemaphore != null) { try { writerSemaphore.Release(); } catch { } LifecycleHelper.PlatformSpecificDispose(writerSemaphore); } file?.Dispose(); LifecycleHelper.PlatformSpecificDispose(exclusiveAccessSemaphore); LifecycleHelper.PlatformSpecificDispose(hasMessagesEvent); LifecycleHelper.PlatformSpecificDispose(noMessagesEvent); LifecycleHelper.PlatformSpecificDispose(clientConnectedEvent); LifecycleHelper.PlatformSpecificDispose(readerSemaphore); throw; } }
private void OnExit(object sender, ExitEventArgs e) => LifecycleHelper.CleanUp();
private void OnStartup(object sender, StartupEventArgs e) => LifecycleHelper.StartUp(e.Args);