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); } } }
public void InitializeAndLock_Reentrancy_DoesNotBlock() { using (var mutex = new GlobalMutex("test")) { using (mutex.InitializeAndLock()) { using (mutex.Lock()) {} } } }
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); } }
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(); } }