From 931214bdd1ef7c10fba105fec7daf5bc09df93c3 Mon Sep 17 00:00:00 2001 From: Jonathan Harper Date: Tue, 9 Apr 2019 10:29:55 -0700 Subject: [PATCH] Fix parallel writes to UnitySDK.log on Windows When using the SubprocessUnityEnvironment, parallel writes are made to UnitySDK.log. This causes file access violation issues in Windows/C#. This change modifies the access and sharing mode for our writes to UnitySDK.log to fix the issue. --- UnitySDK/Assets/ML-Agents/Scripts/Academy.cs | 24 ++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Academy.cs b/UnitySDK/Assets/ML-Agents/Scripts/Academy.cs index 9d2a6cbe2b..d6cecb4acf 100755 --- a/UnitySDK/Assets/ML-Agents/Scripts/Academy.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Academy.cs @@ -346,10 +346,13 @@ private void InitializeEnvironment() Random.InitState(pythonParameters.Seed); Application.logMessageReceived += HandleLog; logPath = Path.GetFullPath(".") + "/UnitySDK.log"; - logWriter = new StreamWriter(logPath, false); - logWriter.WriteLine(System.DateTime.Now.ToString()); - logWriter.WriteLine(" "); - logWriter.Close(); + using (var fs = File.Open(logPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) + { + logWriter = new StreamWriter(fs); + logWriter.WriteLine(System.DateTime.Now.ToString()); + logWriter.WriteLine(" "); + logWriter.Close(); + } } // If a communicator is enabled/provided, then we assume we are in @@ -386,11 +389,14 @@ private void UpdateResetParameters() void HandleLog(string logString, string stackTrace, LogType type) { - logWriter = new StreamWriter(logPath, true); - logWriter.WriteLine(type.ToString()); - logWriter.WriteLine(logString); - logWriter.WriteLine(stackTrace); - logWriter.Close(); + using (var fs = File.Open(logPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) + { + logWriter = new StreamWriter(fs); + logWriter.WriteLine(type.ToString()); + logWriter.WriteLine(logString); + logWriter.WriteLine(stackTrace); + logWriter.Close(); + } } ///