⛏️ index : haiku.git

/*
 * 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<ino_t, FileInfo>::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<ino_t, FileInfo>::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<ino_t, FileInfo>::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<ino_t, FileInfo>::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;
}