@@ -211,21 +211,13 @@ static os::handle open(const string_view Directory)
211211FileSystemWatcher::FileSystemWatcher (const string_view EventId, const string_view Directory, const bool WatchSubtree):
212212 m_EventId(EventId),
213213 m_Directory(nt_path(Directory)),
214- m_WatchSubtree(WatchSubtree),
215- m_DirectoryHandle(open(m_Directory))
214+ m_WatchSubtree(WatchSubtree)
216215{
217- if (!m_DirectoryHandle)
218- {
219- LOGWARNING (L" Skip monitoring of {}" sv, Directory);
220- return ;
221- }
222-
223216 m_Overlapped.hEvent = m_Event.native_handle ();
224-
225217 background_watcher::instance ().add (this );
226218
227- LOGDEBUG ( L" Start monitoring {} {} " sv, m_Directory, WatchSubtree? L" tree " sv : L" directory " sv);
228- read_async ();
219+ if ( open_directory ())
220+ read_async ();
229221}
230222
231223FileSystemWatcher::~FileSystemWatcher ()
@@ -265,9 +257,28 @@ FileSystemWatcher::~FileSystemWatcher()
265257 }
266258}
267259
260+ void FileSystemWatcher::restart_if_needed ()
261+ {
262+ SCOPED_ACTION (std::scoped_lock)(m_CS);
263+
264+ if (m_DirectoryHandle)
265+ return ;
266+
267+ LOGINFO (L" Attempting to restart monitoring of {}" sv, m_Directory);
268+
269+ if (open_directory ())
270+ read_async ();
271+ }
272+
273+ bool FileSystemWatcher::open_directory ()
274+ {
275+ m_DirectoryHandle = open (m_Directory);
276+ return m_DirectoryHandle != nullptr ;
277+ }
278+
268279void FileSystemWatcher::read_async ()
269280{
270- m_Event. reset ( );
281+ LOGDEBUG ( L" Start monitoring {} {} " sv, m_Directory, m_WatchSubtree? L" tree " sv : L" directory " sv );
271282
272283 if (!ReadDirectoryChangesW (
273284 m_DirectoryHandle.native_handle (),
@@ -327,13 +338,18 @@ bool FileSystemWatcher::get_result() const
327338
328339void FileSystemWatcher::callback_notify ()
329340{
330- if (!m_DirectoryHandle)
331- return ;
332-
333- if (!get_result ())
334341 {
335- LOGDEBUG (L" Stop monitoring {}" sv, m_Directory);
336- return ;
342+ SCOPE_EXIT{ m_Event.reset (); };
343+
344+ if (!m_DirectoryHandle)
345+ return ;
346+
347+ if (!get_result ())
348+ {
349+ LOGWARNING (L" Stop monitoring {}" sv, m_Directory);
350+ m_DirectoryHandle = {};
351+ return ;
352+ }
337353 }
338354
339355 LOGDEBUG (L" Change event in {}" sv, m_Directory);
0 commit comments