* 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
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];
};
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;
};
}
using UserlandFS::RequestThreadContext;
using UserlandFS::RequestThread;
#endif