root/src/add-ons/kernel/file_systems/userlandfs/server/RequestThread.h
/*
 * 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