protected void SaveMobiles(SaveMetrics metrics) { Dictionary <Serial, Mobile> mobiles = World.Mobiles; GenericWriter idx; GenericWriter tdb; GenericWriter bin; if (UseSequentialWriters) { idx = new BinaryFileWriter(World.MobileIndexPath, false); tdb = new BinaryFileWriter(World.MobileTypesPath, false); bin = new BinaryFileWriter(World.MobileDataPath, true); } else { idx = new AsyncWriter(World.MobileIndexPath, false); tdb = new AsyncWriter(World.MobileTypesPath, false); bin = new AsyncWriter(World.MobileDataPath, true); } idx.Write((int)mobiles.Count); foreach (Mobile m in mobiles.Values) { long start = bin.Position; idx.Write((int)m.m_TypeRef); idx.Write((int)m.Serial); idx.Write((long)start); m.Serialize(bin); if (metrics != null) { metrics.OnMobileSaved((int)(bin.Position - start)); } idx.Write((int)(bin.Position - start)); m.FreeCache(); } tdb.Write((int)World.m_MobileTypes.Count); for (int i = 0; i < World.m_MobileTypes.Count; ++i) { tdb.Write(World.m_MobileTypes[i].FullName); } idx.Close(); tdb.Close(); bin.Close(); }
public override void Save(SaveMetrics metrics, bool permitBackgroundWrite) { _permitBackgroundWrite = permitBackgroundWrite; SaveMobiles(metrics); SaveItems(metrics); SaveGuilds(metrics); if (permitBackgroundWrite && UseSequentialWriters) //If we're permitted to write in the background, but we don't anyways, then notify. { World.NotifyDiskWriteComplete(); } }
public SequentialFileWriter(string path, SaveMetrics metrics) { if (path == null) { throw new ArgumentNullException("path"); } this.metrics = metrics; this.fileStream = FileOperations.OpenSequentialStream(path, FileMode.Create, FileAccess.Write, FileShare.None); fileQueue = new FileQueue( Math.Max(1, FileOperations.Concurrency), FileCallback ); }
public override void Save(SaveMetrics metrics, bool permitBackgroundWrite) { this.metrics = metrics; OpenFiles(); consumers = new Consumer[GetThreadCount()]; for (int i = 0; i < consumers.Length; ++i) { consumers[i] = new Consumer(this, 256); } IEnumerable <ISerializable> collection = new Producer(); foreach (ISerializable value in collection) { while (!Enqueue(value)) { if (!Commit()) { Thread.Sleep(0); } } } finished = true; SaveTypeDatabases(); WaitHandle.WaitAll( Array.ConvertAll <Consumer, WaitHandle>( consumers, delegate(Consumer input) { return(input.completionEvent); } ) ); Commit(); CloseFiles(); }
public override void Save(SaveMetrics metrics, bool permitBackgroundWrite) { this.PermitBackgroundWrite = permitBackgroundWrite; Thread saveThread = new Thread(delegate() { SaveItems(metrics); }); saveThread.Name = "Item Save Subset"; saveThread.Start(); SaveMobiles(metrics); SaveGuilds(metrics); saveThread.Join(); if (permitBackgroundWrite && UseSequentialWriters) //If we're permitted to write in the background, but we don't anyways, then notify. { World.NotifyDiskWriteComplete(); } }
protected void SaveGuilds(SaveMetrics metrics) { GenericWriter idx; GenericWriter bin; if (UseSequentialWriters) { idx = new BinaryFileWriter(World.GuildIndexPath, false); bin = new BinaryFileWriter(World.GuildDataPath, true); } else { idx = new AsyncWriter(World.GuildIndexPath, false); bin = new AsyncWriter(World.GuildDataPath, true); } idx.Write((int)BaseGuild.List.Count); foreach (BaseGuild guild in BaseGuild.List.Values) { long start = bin.Position; idx.Write((int)0);//guilds have no typeid idx.Write((int)guild.Id); idx.Write((long)start); guild.Serialize(bin); if (metrics != null) { metrics.OnGuildSaved((int)(bin.Position - start)); } idx.Write((int)(bin.Position - start)); } idx.Close(); bin.Close(); }
public abstract void Save(SaveMetrics metrics, bool permitBackgroundWrite);