/* * Copyright 2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: * Paweł Dziepak, pdziepak@quarnos.org */ #include "InodeIdMap.h" status_t InodeIdMap::AddName(FileInfo& fileInfo, InodeNames* parent, const char* name, ino_t id) { MutexLocker _(fLock); AVLTreeMap::Iterator iterator = fMap.Find(id); if (iterator.HasCurrent()) { if (fileInfo.fHandle == iterator.Current().fHandle) { return iterator.CurrentValuePointer()->fNames->AddName(parent, name); } } fMap.Remove(id); fileInfo.fNames = new InodeNames; if (fileInfo.fNames == NULL) return B_NO_MEMORY; fileInfo.fNames->fHandle = fileInfo.fHandle; status_t result = fileInfo.fNames->AddName(parent, name); if (result != B_OK) { delete fileInfo.fNames; return result; } return fMap.Insert(id, fileInfo); } bool InodeIdMap::RemoveName(ino_t id, InodeNames* parent, const char* name) { ASSERT(name != NULL); MutexLocker _(fLock); AVLTreeMap::Iterator iterator = fMap.Find(id); if (!iterator.HasCurrent()) return true; FileInfo* fileInfo = iterator.CurrentValuePointer(); return fileInfo->fNames->RemoveName(parent, name); } status_t InodeIdMap::RemoveEntry(ino_t id) { MutexLocker _(fLock); return fMap.Remove(id); } status_t InodeIdMap::GetFileInfo(FileInfo* fileInfo, ino_t id) { ASSERT(fileInfo != NULL); MutexLocker _(fLock); AVLTreeMap::Iterator iterator = fMap.Find(id); if (!iterator.HasCurrent()) return B_ENTRY_NOT_FOUND; *fileInfo = iterator.Current(); if (fileInfo->fNames->fNames.IsEmpty()) return B_ENTRY_NOT_FOUND; return B_OK; } void InodeIdMap::Dump(void (*xprintf)(const char*, ...)) { MutexLocker locker; if (xprintf != kprintf) locker.SetTo(fLock, false); _DumpLocked(xprintf); return; } void InodeIdMap::_DumpLocked(void (*xprintf)(const char*, ...)) const { xprintf("InodeIdMap at %p\n", this); xprintf("\tino\thandle\n"); AVLTreeMap::ConstIterator iterator = fMap.GetIterator(); for (iterator.Next(); iterator.HasNext(); iterator.Next()) { ino_t ino = iterator.CurrentKey(); xprintf("\t%" B_PRIdINO "\t", ino); const FileInfo* fileInfo = iterator.CurrentValuePointer(); if (fileInfo != NULL) fileInfo->fHandle.Dump(xprintf); } return; }