예제 #1
0
        /// <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));
        }
예제 #2
0
        /// <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);
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
 /// <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)));
 }