From 5b362d3f61caaedc3c22f6a8c7d716d9c92a5470 Mon Sep 17 00:00:00 2001 From: H-Chris233 Date: Mon, 25 May 2026 09:15:49 +0800 Subject: [PATCH] fix: cap watcher directories to wait-object limit --- src/Utils/FileWatcher.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Utils/FileWatcher.cpp b/src/Utils/FileWatcher.cpp index 1b5b061..77e5e0b 100644 --- a/src/Utils/FileWatcher.cpp +++ b/src/Utils/FileWatcher.cpp @@ -107,6 +107,11 @@ namespace FileWatcher { static void WatcherThread() { const size_t numDirs = g_watchDirs.size(); + if (numDirs == 0) { + LOG_PACKAGE_WARN("No directories configured for watcher"); + return; + } + std::vector dirHandles(numDirs, nullptr); std::vector overlapped(numDirs); std::vector events(numDirs, nullptr); @@ -199,11 +204,23 @@ namespace FileWatcher { } void Start(const std::vector& directories) { + if (directories.empty()) { + LOG_PACKAGE_WARN("No directories configured for watcher start"); + return; + } + + std::vector effectiveDirs = directories; + if (effectiveDirs.size() > MAXIMUM_WAIT_OBJECTS) { + LOG_PACKAGE_WARN("Too many watch directories: {} (max supported by WaitForMultipleObjects: {})", + effectiveDirs.size(), MAXIMUM_WAIT_OBJECTS); + effectiveDirs.resize(MAXIMUM_WAIT_OBJECTS); + } + if (g_running.exchange(true)) { LOG_PACKAGE_WARN("Already running"); return; } - g_watchDirs = directories; + g_watchDirs = effectiveDirs; g_watcherThread = std::thread(WatcherThread); }