root/headers/private/userlandfs/private/RequestPort.h
// RequestPort.h

#ifndef USERLAND_FS_REQUEST_PORT_H
#define USERLAND_FS_REQUEST_PORT_H

#include "Port.h"
#include "RequestAllocator.h"

namespace UserlandFSUtil {

class RequestHandler;

// RequestPort
class RequestPort {
public:
                                                                RequestPort(int32 size);
                                                                RequestPort(const Port::Info* info);
                                                                ~RequestPort();

                        void                            Close();

                        status_t                        InitCheck() const;

                        Port*                           GetPort();
                        const Port::Info*       GetPortInfo() const;

                        status_t                        SendRequest(RequestAllocator* allocator);
                        status_t                        SendRequest(RequestAllocator* allocator,
                                                                        RequestHandler* handler,
                                                                        Request** reply = NULL,
                                                                        bigtime_t timeout = -1);
                        status_t                        ReceiveRequest(Request** request,
                                                                        bigtime_t timeout = -1);
                        status_t                        HandleRequests(RequestHandler* handler,
                                                                        Request** reply = NULL,
                                                                        bigtime_t timeout = -1);

                        void                            ReleaseRequest(Request* request);

private:
                        void                            _PopAllocator();

private:
                        friend class ::KernelDebug;
                        struct AllocatorNode;

                        Port                            fPort;
                        AllocatorNode*          fCurrentAllocatorNode;
};

// RequestReleaser
class RequestReleaser {
public:
        inline RequestReleaser(RequestPort* port, Request* request)
                : fPort(port), fRequest(request) {}

        inline ~RequestReleaser()
        {
                if (fPort && fRequest)
                        fPort->ReleaseRequest(fRequest);
        }

private:
        RequestPort*    fPort;
        Request*                fRequest;
};

}       // namespace UserlandFSUtil

using UserlandFSUtil::RequestPort;
using UserlandFSUtil::RequestReleaser;

#endif  // USERLAND_FS_REQUEST_PORT_H