From 50e94eb373ee7540d035065dab99440cc03bd7d9 Mon Sep 17 00:00:00 2001 From: jta Date: Tue, 7 Jun 2022 12:54:28 -0400 Subject: [PATCH] File IO Rate Limiting feature: adds rate limiting for FileIO --- .../PepperDashEssentialsBase/File/FileIO.cs | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs index 6de047c9..f92a46fe 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/File/FileIO.cs @@ -15,14 +15,19 @@ namespace PepperDash.Essentials.Core static CCriticalSection fileLock = new CCriticalSection(); public delegate void GotFileEventHandler(object sender, FileEventArgs e); public static event GotFileEventHandler GotFileEvent; - + private static Dictionary WriteTimers; + public const long WriteTimeout = 5000; /// /// Get the full file info from a path/filename, can include wildcards. /// /// /// /// - + static FileIO() + { + WriteTimers = new Dictionary(); + } + public static FileInfo[] GetFiles(string fileName) { DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName)); @@ -170,7 +175,8 @@ namespace PepperDash.Essentials.Core } else { - Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock"); + Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock retrying"); + } } @@ -190,6 +196,41 @@ namespace PepperDash.Essentials.Core } + /// + /// Resets (or starts) the write timer + /// + static void ResetTimer(string data, string filePath) + { + try + { + if (WriteTimers.ContainsKey(filePath)) + { + WriteTimers[filePath].Stop(); + WriteTimers[filePath] = null; + WriteTimers.Remove(filePath); + } + WriteTimers.Add(filePath, new CTimer((o) => + { + Thread _WriteFileThread; + _WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended); + _WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority; + _WriteFileThread.Start(); + Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread"); + WriteTimers.Remove(filePath); + }, WriteTimeout)); + + + + Debug.Console(0, "FileIO write timer has been reset."); + } + catch (Exception e) + { + Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO ResetTimer failed: \r{0}", e); + data = ""; + } + } + + /// /// /// @@ -202,11 +243,7 @@ namespace PepperDash.Essentials.Core /// public static void WriteDataToFile(string data, string filePath) { - Thread _WriteFileThread; - _WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended); - _WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority; - _WriteFileThread.Start(); - Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread"); + ResetTimer(data, filePath); } @@ -241,6 +278,7 @@ namespace PepperDash.Essentials.Core fileLock.Leave(); } + Debug.Console(0, Debug.ErrorLogLevel.Notice, "File Written to : '{0}'", filePath); return null; }