/// <summary> /// Protected implementation of Dispose pattern. /// </summary> /// <param name="disposing"></param> protected virtual void Dispose(bool disposing) { if (isDisposed || !disposing) { return; } // Close shared memory. // globalMemoryRegionView?.Dispose(); globalMemoryRegionView = null; controlChannelMemoryMapView?.Dispose(); controlChannelMemoryMapView = null; feedbackChannelMemoryMapView?.Dispose(); feedbackChannelMemoryMapView = null; controlChannelNamedEvent?.Dispose(); controlChannelNamedEvent = null; feedbackChannelNamedEvent?.Dispose(); feedbackChannelNamedEvent = null; // Finally dispose the shared config manager. // SharedConfigManager?.Dispose(); SharedConfigManager = null; isDisposed = true; }
/// <summary> /// Initializes a new instance of the <see cref="InterProcessMlosContext"/> class. /// </summary> /// <param name="globalMemoryRegionView"></param> /// <param name="controlChannelMemoryMapView"></param> /// <param name="feedbackChannelMemoryMapView"></param> /// <param name="controlChannelNamedEvent"></param> /// <param name="feedbackChannelNamedEvent"></param> /// <param name="targetProcessNamedEvent"></param> internal InterProcessMlosContext( SharedMemoryRegionView <MlosProxyInternal.GlobalMemoryRegion> globalMemoryRegionView, SharedMemoryMapView controlChannelMemoryMapView, SharedMemoryMapView feedbackChannelMemoryMapView, NamedEvent controlChannelNamedEvent, NamedEvent feedbackChannelNamedEvent, NamedEvent targetProcessNamedEvent) { this.globalMemoryRegionView = globalMemoryRegionView; this.controlChannelMemoryMapView = controlChannelMemoryMapView; this.feedbackChannelMemoryMapView = feedbackChannelMemoryMapView; this.controlChannelNamedEvent = controlChannelNamedEvent; this.feedbackChannelNamedEvent = feedbackChannelNamedEvent; this.targetProcessNamedEvent = targetProcessNamedEvent; // Create the shared config manager. // SharedConfigManager = new SharedConfigManager(); MlosProxyInternal.GlobalMemoryRegion globalMemoryRegion = globalMemoryRegionView.MemoryRegion(); // Increase the usage counter. When closing global shared memory, we will decrease the counter. // If there is no process using the shared memory, we will clean the OS resources. On Windows OS, // this is no-op; on Linux, we unlink created files. // globalMemoryRegion.AttachedProcessesCount.FetchAdd(1); // Create the control channel instance. // ControlChannel = new SharedChannel <InterProcessSharedChannelPolicy, SharedChannelSpinPolicy>( buffer: controlChannelMemoryMapView.Buffer, size: (uint)controlChannelMemoryMapView.MemSize, sync: globalMemoryRegion.ControlChannelSynchronization) { ChannelPolicy = { NotificationEvent = controlChannelNamedEvent }, }; // Create the feedback channel instance. // FeedbackChannel = new SharedChannel <InterProcessSharedChannelPolicy, SharedChannelSpinPolicy>( buffer: feedbackChannelMemoryMapView.Buffer, size: (uint)feedbackChannelMemoryMapView.MemSize, sync: globalMemoryRegion.FeedbackChannelSynchronization) { ChannelPolicy = { NotificationEvent = feedbackChannelNamedEvent }, }; }
/// <summary> /// Initializes a new instance of the <see cref="InterProcessMlosContext"/> class. /// </summary> /// <param name="globalMemoryRegionView"></param> /// <param name="controlChannelMemoryMapView"></param> /// <param name="feedbackChannelMemoryMapView"></param> /// <param name="controlChannelNamedEvent"></param> /// <param name="feedbackChannelNamedEvent"></param> /// <param name="targetProcessNamedEvent"></param> private InterProcessMlosContext( SharedMemoryRegionView <MlosProxyInternal.GlobalMemoryRegion> globalMemoryRegionView, SharedMemoryMapView controlChannelMemoryMapView, SharedMemoryMapView feedbackChannelMemoryMapView, NamedEvent controlChannelNamedEvent, NamedEvent feedbackChannelNamedEvent, NamedEvent targetProcessNamedEvent) { this.globalMemoryRegionView = globalMemoryRegionView ?? throw new ArgumentNullException(nameof(globalMemoryRegionView)); this.controlChannelMemoryMapView = controlChannelMemoryMapView ?? throw new ArgumentNullException(nameof(controlChannelMemoryMapView)); this.feedbackChannelMemoryMapView = feedbackChannelMemoryMapView ?? throw new ArgumentNullException(nameof(feedbackChannelMemoryMapView)); this.controlChannelNamedEvent = controlChannelNamedEvent ?? throw new ArgumentNullException(nameof(controlChannelNamedEvent)); this.feedbackChannelNamedEvent = feedbackChannelNamedEvent ?? throw new ArgumentNullException(nameof(feedbackChannelNamedEvent)); this.targetProcessNamedEvent = targetProcessNamedEvent ?? throw new ArgumentNullException(nameof(targetProcessNamedEvent)); // Create the shared config manager. // SharedConfigManager = new SharedConfigManager(); MlosProxyInternal.GlobalMemoryRegion globalMemoryRegion = globalMemoryRegionView.MemoryRegion(); // Increase the usage counter. When closing global shared memory, we will decrease the counter. // If there is no process using the shared memory, we will clean the OS resources. On Windows OS, // this is no-op; on Linux, we unlink created files. // globalMemoryRegion.AttachedProcessesCount.FetchAdd(1); // Create the control channel instance. // ControlChannel = new SharedChannel <InterProcessSharedChannelPolicy, SharedChannelSpinPolicy>( buffer: controlChannelMemoryMapView.Buffer, size: (uint)controlChannelMemoryMapView.MemSize, sync: globalMemoryRegion.ControlChannelSynchronization) { ChannelPolicy = { NotificationEvent = controlChannelNamedEvent }, }; // Create the feedback channel instance. // FeedbackChannel = new SharedChannel <InterProcessSharedChannelPolicy, SharedChannelSpinPolicy>( buffer: feedbackChannelMemoryMapView.Buffer, size: (uint)feedbackChannelMemoryMapView.MemSize, sync: globalMemoryRegion.FeedbackChannelSynchronization) { ChannelPolicy = { NotificationEvent = feedbackChannelNamedEvent }, }; // Register config region if available. // if (globalMemoryRegion.TryOpenExisting( new MlosInternal.MemoryRegionId { Type = MlosInternal.MemoryRegionType.SharedConfig, Index = 0, }, out SharedMemoryMapView sharedConfigMemoryMap)) { var sharedMemoryRegionView = new SharedMemoryRegionView <MlosProxyInternal.SharedConfigMemoryRegion>(sharedConfigMemoryMap); SharedConfigManager.RegisterSharedConfigMemoryRegion(sharedMemoryRegionView); } else { sharedConfigMemoryMap?.Dispose(); } }