⛏️ index : haiku.git

/*
 * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef USERLAND_FS_REQUEST_THREAD_H
#define USERLAND_FS_REQUEST_THREAD_H

#include "RequestPort.h"

namespace UserlandFS {

class FileSystem;
class RequestThread;
class Volume;

#define REQUEST_THREAD_CONTEXT_FS_DATA_SIZE	256

// RequestThreadContext
class RequestThreadContext {
public:
								RequestThreadContext(Volume* volume,
									KernelRequest* request);
								~RequestThreadContext();

			RequestThread*		GetThread() const;
			Volume*				GetVolume() const;
			KernelRequest*		GetRequest() const	{ return fRequest; }
			void*				GetFSData() 		{ return fFSData; }

private:
			RequestThreadContext*	fPreviousContext;
			RequestThread*		fThread;
			Volume*				fVolume;
			KernelRequest*		fRequest;
			uint8				fFSData[REQUEST_THREAD_CONTEXT_FS_DATA_SIZE];
};

// RequestThread
class RequestThread {
public:
								RequestThread();
								~RequestThread();

			status_t			Init(FileSystem* fileSystem);
			void				Run();
			void				PrepareTermination();
			void				Terminate();

			const Port::Info*	GetPortInfo() const;
			FileSystem*			GetFileSystem() const;
			RequestPort*		GetPort() const;
			RequestThreadContext*	GetContext() const;

	static	RequestThread*		GetCurrentThread();

private:
			void				SetContext(RequestThreadContext* context);

private:
	static	int32				_ThreadEntry(void* data);
			int32				_ThreadLoop();

private:
			friend class RequestThreadContext;

			thread_id			fThread;
			FileSystem*			fFileSystem;
			RequestPort*		fPort;
			RequestThreadContext* fContext;
			bool				fTerminating;
};

}	// namespace UserlandFS

using UserlandFS::RequestThreadContext;
using UserlandFS::RequestThread;

#endif	// USERLAND_FS_REQUEST_THREAD_H