/*static*/ status_t BPathMonitor::StopWatching(const char* path, BMessenger target) { if (sLocker == NULL) return B_NO_INIT; TRACE("StopWatching(%s)\n", path); BAutolock _(sLocker); WatcherMap::iterator iterator = sWatchers.find(target); if (iterator == sWatchers.end()) return B_BAD_VALUE; Watcher* watcher = iterator->second; HandlerMap::iterator i = watcher->handlers.find(path); if (i == watcher->handlers.end()) return B_BAD_VALUE; PathHandler* handler = i->second; watcher->handlers.erase(i); handler->Quit(); if (watcher->handlers.empty()) { sWatchers.erase(iterator); delete watcher; } return B_OK; }
/*static*/ status_t BPathMonitor::StopWatching(BMessenger target) { if (sLocker == NULL) return B_NO_INIT; BAutolock _(sLocker); WatcherMap::iterator iterator = sWatchers.find(target); if (iterator == sWatchers.end()) return B_BAD_VALUE; Watcher* watcher = iterator->second; while (!watcher->handlers.empty()) { HandlerMap::iterator i = watcher->handlers.begin(); PathHandler* handler = i->second; watcher->handlers.erase(i); handler->Quit(); } sWatchers.erase(iterator); delete watcher; return B_OK; }
void FileWatcher::pollAll() { // check each file: WatcherMap::iterator it = gWatchedFiles.begin(); while (it != gWatchedFiles.end()) { it->second.test(); it++; } }
FileWatcher::~FileWatcher(){ // check each file: WatcherMap::iterator it = gWatchedFiles.begin(); while (it != gWatchedFiles.end()) { it->second.remove(this); it++; } }
/*static*/ status_t BPathMonitor::StartWatching(const char* path, uint32 flags, BMessenger target) { TRACE("StartWatching(%s)\n", path); status_t status = _InitLockerIfNeeded(); if (status != B_OK) return status; // use the global looper for receiving node monitor notifications status = _InitLooperIfNeeded(); if (status < B_OK) return status; BAutolock _(sLocker); WatcherMap::iterator iterator = sWatchers.find(target); Watcher* watcher = NULL; if (iterator != sWatchers.end()) watcher = iterator->second; PathHandler* handler = new (nothrow) PathHandler(path, flags, target, sLooper); if (handler == NULL) return B_NO_MEMORY; status = handler->InitCheck(); if (status < B_OK) { delete handler; return status; } if (watcher == NULL) { watcher = new (nothrow) BPrivate::Watcher; if (watcher == NULL) { delete handler; return B_NO_MEMORY; } sWatchers[target] = watcher; } watcher->handlers[path] = handler; return B_OK; }