+ Don't allow processing of the Timer changed queue while the world is loading or saving.
* Removes the risk of inconsistency [warnings] generated by timers that tick with handlers that modify World.Items and World.Mobiles during I/O. + Update description of Core.TickCount.
This commit is contained in:
parent
5d50a5a37c
commit
887ca5d341
3 changed files with 22 additions and 20 deletions
|
|
@ -1,10 +1,12 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<configuration>
|
|
||||||
<runtime>
|
<configuration>
|
||||||
<gcServer enabled="true" />
|
<startup>
|
||||||
</runtime>
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
|
||||||
<!--
|
</startup>
|
||||||
MONO/Linux users will need to uncomment and modify the following line:
|
<runtime>
|
||||||
-->
|
<gcServer enabled="true" />
|
||||||
<!--<dllmap dll="libz" target="/lib/x86_64-linux-gnu/libz.so.1" />-->
|
</runtime>
|
||||||
|
<!--MONO/Linux users will need to uncomment and modify the following line:-->
|
||||||
|
<!--<dllmap dll="libz" target="/lib/x86_64-linux-gnu/libz.so.1" />-->
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
@ -107,23 +107,17 @@ namespace Server
|
||||||
public static Thread Thread { get { return m_Thread; } }
|
public static Thread Thread { get { return m_Thread; } }
|
||||||
public static MultiTextWriter MultiConsoleOut { get { return m_MultiConOut; } }
|
public static MultiTextWriter MultiConsoleOut { get { return m_MultiConOut; } }
|
||||||
|
|
||||||
/* DateTime.Now and DateTime.UtcNow are based on actual system clock time.
|
/*
|
||||||
|
* DateTime.Now and DateTime.UtcNow are based on actual system clock time.
|
||||||
* The resolution is acceptable but large clock jumps are possible and cause issues.
|
* The resolution is acceptable but large clock jumps are possible and cause issues.
|
||||||
* GetTickCount and GetTickCount64 have poor resolution.
|
* GetTickCount and GetTickCount64 have poor resolution.
|
||||||
* GetTickCount64 is unavailable on Windows XP and Windows Server 2003.
|
* GetTickCount64 is unavailable on Windows XP and Windows Server 2003.
|
||||||
* Stopwatch.GetTimestamp() (QueryPerformanceCounter) is high resolution, but
|
* Stopwatch.GetTimestamp() (QueryPerformanceCounter) is high resolution, but
|
||||||
* somewhat expensive to call and unreliable with certain system configurations.
|
* somewhat expensive to call because of its defference to DateTime.Now,
|
||||||
|
* which is why Stopwatch has been used to verify HRT before calling GetTimestamp(),
|
||||||
|
* enabling the usage of DateTime.UtcNow instead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* The following implementation contains an effective substitute for GetTickCount64 that
|
|
||||||
* is reliable as long as it is retrieved once every 2^32 ms (~49 days).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* We don't really need this, but it may be useful in the future.
|
|
||||||
private static ThreadLocal<long> _HighOrder = new ThreadLocal<long>();
|
|
||||||
private static ThreadLocal<uint> _LastTickCount = new ThreadLocal<uint>();
|
|
||||||
*/
|
|
||||||
|
|
||||||
private static readonly bool _HighRes = Stopwatch.IsHighResolution;
|
private static readonly bool _HighRes = Stopwatch.IsHighResolution;
|
||||||
|
|
||||||
private static readonly double _HighFrequency = 1000.0 / Stopwatch.Frequency;
|
private static readonly double _HighFrequency = 1000.0 / Stopwatch.Frequency;
|
||||||
|
|
|
||||||
|
|
@ -313,6 +313,12 @@ namespace Server
|
||||||
|
|
||||||
while ( !Core.Closing )
|
while ( !Core.Closing )
|
||||||
{
|
{
|
||||||
|
if (World.Loading || World.Saving)
|
||||||
|
{
|
||||||
|
m_Signal.WaitOne(1, false);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ProcessChanged();
|
ProcessChanged();
|
||||||
|
|
||||||
loaded = false;
|
loaded = false;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue