1/* 2 * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef USERLAND_FS_REQUEST_THREAD_H 6#define USERLAND_FS_REQUEST_THREAD_H 7 8#include "RequestPort.h" 9 10namespace UserlandFS { 11 12class FileSystem; 13class RequestThread; 14class Volume; 15 16#define REQUEST_THREAD_CONTEXT_FS_DATA_SIZE 256 17 18// RequestThreadContext 19class RequestThreadContext { 20public: 21 RequestThreadContext(Volume* volume, 22 KernelRequest* request); 23 ~RequestThreadContext(); 24 25 RequestThread* GetThread() const; 26 Volume* GetVolume() const; 27 KernelRequest* GetRequest() const { return fRequest; } 28 void* GetFSData() { return fFSData; } 29 30private: 31 RequestThreadContext* fPreviousContext; 32 RequestThread* fThread; 33 Volume* fVolume; 34 KernelRequest* fRequest; 35 uint8 fFSData[REQUEST_THREAD_CONTEXT_FS_DATA_SIZE]; 36}; 37 38// RequestThread 39class RequestThread { 40public: 41 RequestThread(); 42 ~RequestThread(); 43 44 status_t Init(FileSystem* fileSystem); 45 void Run(); 46 void PrepareTermination(); 47 void Terminate(); 48 49 const Port::Info* GetPortInfo() const; 50 FileSystem* GetFileSystem() const; 51 RequestPort* GetPort() const; 52 RequestThreadContext* GetContext() const; 53 54 static RequestThread* GetCurrentThread(); 55 56private: 57 void SetContext(RequestThreadContext* context); 58 59private: 60 static int32 _ThreadEntry(void* data); 61 int32 _ThreadLoop(); 62 63private: 64 friend class RequestThreadContext; 65 66 thread_id fThread; 67 FileSystem* fFileSystem; 68 RequestPort* fPort; 69 RequestThreadContext* fContext; 70 bool fTerminating; 71}; 72 73} // namespace UserlandFS 74 75using UserlandFS::RequestThreadContext; 76using UserlandFS::RequestThread; 77 78#endif // USERLAND_FS_REQUEST_THREAD_H 79