/// <summary> /// Initializes a new instance of the <see cref="InterProcessMlosContext"/> class. /// </summary> /// <returns>InterProcessMlosContext instance.</returns> public static InterProcessMlosContext CreateOrOpen() { NamedEvent targetProcessNamedEvent = NamedEvent.CreateOrOpen(TargetProcessEventName); { bool shouldWaitForTargetProcess = false; try { // Try open a global shared memory and check if the tager process is fully initialized. // using SharedMemoryRegionView <MlosProxyInternal.GlobalMemoryRegion> targetProcessMemoryRegionView = SharedMemoryRegionView.OpenExisting <MlosProxyInternal.GlobalMemoryRegion>(GlobalMemoryMapName, SharedMemorySize); if (targetProcessMemoryRegionView.MemoryRegion().GlobalMemoryRegionIndex == 1) { shouldWaitForTargetProcess = true; } } catch (FileNotFoundException) { // If the target process is not running. // shouldWaitForTargetProcess = true; } if (shouldWaitForTargetProcess) { // If the target process is not fully initialized, wait for the signal. // targetProcessNamedEvent.Wait(); targetProcessNamedEvent.Signal(); } } SharedMemoryRegionView <MlosProxyInternal.GlobalMemoryRegion> globalMemoryRegionView = SharedMemoryRegionView.OpenExisting <MlosProxyInternal.GlobalMemoryRegion>(GlobalMemoryMapName, SharedMemorySize); SharedMemoryMapView controlChannelMemoryMapView = SharedMemoryMapView.OpenExisting(ControlChannelMemoryMapName, SharedMemorySize); SharedMemoryMapView feedbackChannelMemoryMapView = SharedMemoryMapView.OpenExisting(FeedbackChannelMemoryMapName, SharedMemorySize); // Create channel synchronization primitives. // NamedEvent controlChannelNamedEvent = NamedEvent.CreateOrOpen(ControlChannelEventName); NamedEvent feedbackChannelNamedEvent = NamedEvent.CreateOrOpen(FeedbackChannelEventName); return(new InterProcessMlosContext( globalMemoryRegionView, controlChannelMemoryMapView, feedbackChannelMemoryMapView, controlChannelNamedEvent, feedbackChannelNamedEvent, targetProcessNamedEvent)); }
/// <summary> /// Creates or opens a shared memory region view. /// </summary> /// <typeparam name="T">Memory region type.</typeparam> /// <param name="sharedMemoryMapName"></param> /// <param name="sharedMemorySize"></param> /// <returns></returns> public static SharedMemoryRegionView <T> CreateOrOpen <T>(string sharedMemoryMapName, ulong sharedMemorySize) where T : ICodegenProxy, new() { try { return(new SharedMemoryRegionView <T>(SharedMemoryMapView.OpenExisting(sharedMemoryMapName, sharedMemorySize))); } catch (FileNotFoundException) { var memoryRegionView = new SharedMemoryRegionView <T>(SharedMemoryMapView.CreateNew(sharedMemoryMapName, sharedMemorySize)); MlosProxyInternal.MemoryRegionInitializer <T> memoryRegionInitializer = default; memoryRegionInitializer.Initialize(memoryRegionView); return(memoryRegionView); } }
/// <summary> /// Registers a shared config memory region created by the target process. /// </summary> /// <param name="sharedMemoryRegionIndex"></param> /// <param name="sharedMemoryMapName"></param> /// <param name="memoryRegionSize"></param> public void RegisterSharedConfigMemoryRegion(uint sharedMemoryRegionIndex, string sharedMemoryMapName, ulong memoryRegionSize) { if (sharedConfigMemoryRegionView != null) { if (sharedConfigMemoryRegionView.MemoryRegion().MemoryHeader.MemoryRegionId.Index == sharedMemoryRegionIndex) { // Shared memory region has been already registered. // return; } else { throw new NotImplementedException("Only a single shared config memory region is currently supported."); } } // Create a shared config memory region. // SharedMemoryMapView sharedConfigMemoryMapView = SharedMemoryMapView.OpenExisting( sharedMemoryMapName, memoryRegionSize); sharedConfigMemoryRegionView = new SharedMemoryRegionView <MlosProxyInternal.SharedConfigMemoryRegion>(sharedConfigMemoryMapView); }
/// <summary> /// Opens an existing shared memory region view. /// </summary> /// <typeparam name="T">Memory region type.</typeparam> /// <param name="sharedMemoryMapName"></param> /// <param name="sharedMemorySize"></param> /// <returns></returns> public static SharedMemoryRegionView <T> OpenExisting <T>(string sharedMemoryMapName, ulong sharedMemorySize) where T : ICodegenProxy, new() { return(new SharedMemoryRegionView <T>(SharedMemoryMapView.OpenExisting(sharedMemoryMapName, sharedMemorySize))); }