Shutdown() drained pending writes and applied them. That accomplished nothing: no save runs on shutdown -- World.Save() is reachable only from the autosave timer and the console command, and HandleClosed merely waits for an in-progress write before Environment.Exit(0) -- so an applied write lands in an Account that is immediately discarded. It was justified as becoming correct once a shutdown save exists, which is building for a fix that does not. It also called Core.LoopContext.ExecuteTasks(), which is not a subscriber's to call. Pumping the shared context from inside a shutdown handler runs other subscribers' posted work at an arbitrary point in the event order. That drain belongs in the core, before the events, and is recorded as such in the follow-up handoff along with the ordering it requires. What is left is stopping the thread, which is the same on both paths, so shutdown and crash now share one implementation. |
||
|---|---|---|
| .. | ||
| Application | ||
| BuildTool | ||
| Logger | ||
| Server | ||
| Server.Tests | ||
| UOContent | ||
| UOContent.Tests | ||