Fix for RunUO Crash if Performance tab on Admin gump is open within first 100seconds of server running.

Completion of the DynamicSaveStrategy.  Background saves are now safe; triggered only by the autoSave or command [BackgroundSave ([BGSave)
This commit is contained in:
asayre 2010-12-20 03:34:25 +00:00
parent 0afa707b24
commit 67af95cf0b
12 changed files with 169 additions and 84 deletions

View file

@ -35,25 +35,38 @@ namespace Server {
}
private Queue<Item> _decayQueue;
private bool _permitBackgroundWrite;
public StandardSaveStrategy() {
_decayQueue = new Queue<Item>();
}
public override void Save( SaveMetrics metrics ) {
SaveMobiles( metrics );
SaveItems( metrics );
SaveGuilds( metrics );
protected bool PermitBackgroundWrite { get { return _permitBackgroundWrite; } set { _permitBackgroundWrite = value; } }
protected bool UseSequentialWriters { get { return (World.SaveType == World.SaveOption.Normal || !_permitBackgroundWrite); } }
public override void Save(SaveMetrics metrics, bool permitBackgroundWrite)
{
_permitBackgroundWrite = permitBackgroundWrite;
SaveMobiles(metrics);
SaveItems(metrics);
SaveGuilds(metrics);
if (UseSequentialWriters)
World.NotifyDiskWriteComplete();
}
protected void SaveMobiles( SaveMetrics metrics ) {
protected void SaveMobiles(SaveMetrics metrics)
{
Dictionary<Serial, Mobile> mobiles = World.Mobiles;
GenericWriter idx;
GenericWriter tdb;
GenericWriter bin;
if ( World.SaveType == World.SaveOption.Normal ) {
if (UseSequentialWriters)
{
idx = new BinaryFileWriter( World.MobileIndexPath, false );
tdb = new BinaryFileWriter( World.MobileTypesPath, false );
bin = new BinaryFileWriter( World.MobileDataPath, true );
@ -92,7 +105,8 @@ namespace Server {
bin.Close();
}
protected void SaveItems( SaveMetrics metrics ) {
protected void SaveItems(SaveMetrics metrics)
{
Dictionary<Serial, Item> items = World.Items;
List<Item> decaying = new List<Item>();
@ -100,7 +114,8 @@ namespace Server {
GenericWriter tdb;
GenericWriter bin;
if ( World.SaveType == World.SaveOption.Normal ) {
if (UseSequentialWriters)
{
idx = new BinaryFileWriter( World.ItemIndexPath, false );
tdb = new BinaryFileWriter( World.ItemTypesPath, false );
bin = new BinaryFileWriter( World.ItemDataPath, true );
@ -142,11 +157,13 @@ namespace Server {
bin.Close();
}
protected void SaveGuilds( SaveMetrics metrics ) {
protected void SaveGuilds(SaveMetrics metrics)
{
GenericWriter idx;
GenericWriter bin;
if ( World.SaveType == World.SaveOption.Normal ) {
if (UseSequentialWriters)
{
idx = new BinaryFileWriter( World.GuildIndexPath, false );
bin = new BinaryFileWriter( World.GuildDataPath, true );
} else {