SIL.FieldWorks.FDO.Infrastructure.Impl.SharedXMLBackendProvider.ShutdownInternal C# (CSharp) Метод

ShutdownInternal() защищенный Метод

protected ShutdownInternal ( ) : void
Результат void
		protected override void ShutdownInternal()
		{
			if (m_commitLogMutex != null && m_commitLogMetadata != null)
			{
				CompleteAllCommits();
				using (m_commitLogMutex.Lock())
				{
#if __MonoCS__
					bool delete = false;
#endif
					using (MemoryMappedViewStream stream = m_commitLogMetadata.CreateViewStream())
					{
						CommitLogMetadata metadata;
						if (TryGetMetadata(stream, out metadata))
						{
							if (metadata.Master == m_peerID)
							{
								// commit any unseen foreign changes
								List<ICmObjectSurrogate> foreignNewbies;
								List<ICmObjectSurrogate> foreignDirtballs;
								List<ICmObjectId> foreignGoners;
								if (GetUnseenForeignChanges(metadata, out foreignNewbies, out foreignDirtballs, out foreignGoners))
								{
									var newObjects = new HashSet<ICmObjectOrSurrogate>(foreignNewbies);
									var editedObjects = new HashSet<ICmObjectOrSurrogate>(foreignDirtballs);
									var removedObjects = new HashSet<ICmObjectId>(foreignGoners);

									IEnumerable<CustomFieldInfo> fields;
									if (HaveAnythingToCommit(newObjects, editedObjects, removedObjects, out fields) && (StartupVersionNumber == ModelVersion))
										base.WriteCommitWork(new CommitWork(newObjects, editedObjects, removedObjects, fields));
								}
								// XML file is now totally up-to-date
								metadata.FileGeneration = metadata.CurrentGeneration;
							}
							RemovePeer(metadata, m_peerID);
#if __MonoCS__
							delete = metadata.Peers.Count == 0;
#endif
							SaveMetadata(stream, metadata);
						}
					}

					base.UnlockProject();

					m_commitLog.Dispose();
					m_commitLog = null;

					m_commitLogMetadata.Dispose();
					m_commitLogMetadata = null;

#if __MonoCS__
					if (delete)
					{
						File.Delete(Path.Combine(m_commitLogDir, CommitLogMetadataName));
						File.Delete(Path.Combine(m_commitLogDir, CommitLogName));
						m_commitLogMutex.Unlink();
					}
#endif
				}
			}

			if (m_commitLogMutex != null)
			{
				m_commitLogMutex.Dispose();
				m_commitLogMutex = null;
			}

			if (CommitThread != null)
			{
				CommitThread.Stop();
				CommitThread.Dispose();
				CommitThread = null;
			}

			foreach (Process peerProcess in m_peerProcesses.Values)
				peerProcess.Close();
			m_peerProcesses.Clear();
		}