コード例 #1
0
ファイル: UserlandFS.cpp プロジェクト: luciang/haiku
// _UnregisterFileSystem
status_t
UserlandFS::_UnregisterFileSystem(const char* name)
{
	if (!name)
		return B_BAD_VALUE;

	// find the FS and decrement its reference counter
	FileSystemInitializer* fileSystemInitializer = NULL;
	bool deleteFS = false;
	{
		FileSystemLocker _(fFileSystems);
		fileSystemInitializer = fFileSystems->Get(name);
		if (!fileSystemInitializer)
			return B_BAD_VALUE;

		deleteFS = fileSystemInitializer->RemoveReference();
		if (deleteFS)
			fFileSystems->Remove(name);
	}

	// delete the FS, if the last reference has been removed
	if (deleteFS)
		delete fileSystemInitializer;
	return B_OK;
}
コード例 #2
0
ファイル: UserlandFS.cpp プロジェクト: luciang/haiku
// RegisterFileSystem
status_t
UserlandFS::RegisterFileSystem(const char* name, FileSystem** _fileSystem)
{
	// check parameters
	if (!name || !_fileSystem)
		return B_BAD_VALUE;

	// check, if we do already know this file system, and create it, if not
	FileSystemInitializer* fileSystemInitializer;
	{
		FileSystemLocker _(fFileSystems);
		fileSystemInitializer = fFileSystems->Get(name);
		if (fileSystemInitializer) {
			fileSystemInitializer->AddReference();
		} else {
			fileSystemInitializer = new(nothrow) FileSystemInitializer(name);
			if (!fileSystemInitializer)
				return B_NO_MEMORY;

			status_t error = fFileSystems->Put(name, fileSystemInitializer);
			if (error != B_OK) {
				delete fileSystemInitializer;
				return error;
			}
		}
	}

	// prepare the file system
	status_t error = fileSystemInitializer->Access();
	if (error != B_OK) {
		_UnregisterFileSystem(name);
		return error;
	}

	*_fileSystem = fileSystemInitializer->GetFileSystem();
	return error;
}
コード例 #3
0
ファイル: KernelDebug.cpp プロジェクト: Ithamar/haiku
// DebugUFS
int
KernelDebug::DebugUFS(int argc, char** argv)
{
	typedef HashMap<String, FileSystemInitializer*> KDebugFSMap;
	UserlandFS* userlandFS = UserlandFS::GetUserlandFS();
	KDebugFSMap& fileSystems = userlandFS->fFileSystems->GetUnsynchronizedMap();

	for (KDebugFSMap::Iterator it = fileSystems.GetIterator();
		 it.HasNext();) {
		KDebugFSMap::Entry entry = it.Next();
		FileSystemInitializer* fsInitializer = entry.value;
		FileSystem* fs = fsInitializer->GetFileSystem();
		kprintf("file system %p: %s\n", fs, (fs ? fs->GetName() : NULL));
		if (fs) {
			kprintf("  port pool %p\n", fs->GetPortPool());
			int32 volumeCount = fs->fVolumes.Count();
			for (int32 i = 0; i < volumeCount; i++) {
				Volume* volume = fs->fVolumes.ElementAt(i);
				kprintf("  volume %p: %ld\n", volume, volume->GetID());
			}
		}
	}
	return 0;
}