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;
            }
        }
Exemple #2
0
        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);
        }
Exemple #4
0
        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;
            }
        }
Exemple #5
0
 private void OnExit(object sender, ExitEventArgs e) => LifecycleHelper.CleanUp();
Exemple #6
0
 private void OnStartup(object sender, StartupEventArgs e) => LifecycleHelper.StartUp(e.Args);