protected override int StartupInternal(int currentModelVersion)
        {
            CreateSettingsStores();
            m_commitLogMutex = new GlobalMutex(MutexName);
            bool createdNew;

            using (m_commitLogMutex.InitializeAndLock(out createdNew))
            {
                CreateSharedMemory(createdNew);
                using (MemoryMappedViewStream stream = m_commitLogMetadata.CreateViewStream())
                {
                    CommitLogMetadata metadata = null;
                    if (!createdNew)
                    {
                        if (TryGetMetadata(stream, out metadata))
                        {
                            CheckExitedPeerProcesses(metadata);
                            if (m_peerProcesses.Count == 0)
                            {
                                createdNew = true;
                            }
                        }
                        else
                        {
                            createdNew = true;
                        }
                    }

                    if (createdNew)
                    {
                        metadata = new CommitLogMetadata();
                    }

                    using (Process curProcess = Process.GetCurrentProcess())
                        metadata.Peers[m_peerID] = new CommitLogPeer {
                            ProcessID = curProcess.Id, Generation = metadata.FileGeneration
                        };

                    if (metadata.Master == Guid.Empty)
                    {
                        base.LockProject();
                        metadata.Master = m_peerID;
                    }

                    int startupModelVersion = ReadInSurrogates(currentModelVersion);
                    // non-master peers cannot migrate the XML file
                    if (startupModelVersion < currentModelVersion && metadata.Master != m_peerID)
                    {
                        throw new LcmDataMigrationForbiddenException();
                    }

                    SaveMetadata(stream, metadata);

                    return(startupModelVersion);
                }
            }
        }
Esempio n. 2
0
 public void InitializeAndLock_Reentrancy_DoesNotBlock()
 {
     using (var mutex = new GlobalMutex("test"))
     {
         using (mutex.InitializeAndLock())
         {
             using (mutex.Lock()) {}
         }
     }
 }
Esempio n. 3
0
 public void InitializeAndLock_CreatedNew_ReturnsTrue()
 {
     using (var mutex = new GlobalMutex("test"))
     {
         mutex.Unlink();
         bool createdNew;
         using (mutex.InitializeAndLock(out createdNew)) {}
         Assert.That(createdNew, Is.True);
     }
 }
Esempio n. 4
0
 public void InitializeAndLock_Existing_ReturnsFalse()
 {
     using (var mutex1 = new GlobalMutex("test"))
     {
         mutex1.Initialize();
         using (var mutex2 = new GlobalMutex("test"))
         {
             bool createdNew;
             using (mutex2.InitializeAndLock(out createdNew)) {}
             Assert.That(createdNew, Is.False);
         }
     }
 }
        protected override void CreateInternal()
        {
            m_commitLogMutex = new GlobalMutex(MutexName);

            using (m_commitLogMutex.InitializeAndLock())
            {
                CreateSharedMemory(true);
                var metadata = new CommitLogMetadata {
                    Master = m_peerID
                };
                using (Process curProcess = Process.GetCurrentProcess())
                    metadata.Peers[m_peerID] = new CommitLogPeer {
                        ProcessID = curProcess.Id, Generation = metadata.FileGeneration
                    };
                using (MemoryMappedViewStream stream = m_commitLogMetadata.CreateViewStream())
                {
                    SaveMetadata(stream, metadata);
                }

                base.CreateInternal();
            }
        }