static void RemoveWatchedDirIfNotReferenced(WatchedDir* wd) { if (IsWatchedDirReferenced(wd)) return; bool ok = ListRemove(&g_watchedDirs, wd); CrashIf(!ok); // memory will be eventually freed in ReadDirectoryChangesNotification() InterlockedIncrement(&gRemovalsPending); QueueUserAPC(StopMonitoringDirAPC, g_threadHandle, (ULONG_PTR)wd); }
static void RemoveWatchedDirIfNotReferenced(WatchedDir *wd) { if (IsWatchedDirReferenced(wd)) return; WatchedDir **currPtr = &g_firstDir; WatchedDir *curr; for (;;) { curr = *currPtr; CrashAlwaysIf(!curr); if (curr == wd) break; currPtr = &(curr->next); } WatchedDir *toRemove = curr; *currPtr = toRemove->next; DeleteWatchedDir(toRemove); }