1// RequestPort.h
2
3#ifndef USERLAND_FS_REQUEST_PORT_H
4#define USERLAND_FS_REQUEST_PORT_H
5
6#include "Port.h"
7#include "RequestAllocator.h"
8
9namespace UserlandFSUtil {
10
11class RequestHandler;
12
13// RequestPort
14class RequestPort {
15public:
16								RequestPort(int32 size);
17								RequestPort(const Port::Info* info);
18								~RequestPort();
19
20			void				Close();
21
22			status_t			InitCheck() const;
23
24			Port*				GetPort();
25			const Port::Info*	GetPortInfo() const;
26
27			status_t			SendRequest(RequestAllocator* allocator);
28			status_t			SendRequest(RequestAllocator* allocator,
29									RequestHandler* handler,
30									Request** reply = NULL,
31									bigtime_t timeout = -1);
32			status_t			ReceiveRequest(Request** request,
33									bigtime_t timeout = -1);
34			status_t			HandleRequests(RequestHandler* handler,
35									Request** reply = NULL,
36									bigtime_t timeout = -1);
37
38			void				ReleaseRequest(Request* request);
39
40private:
41			void				_PopAllocator();
42
43private:
44			friend class ::KernelDebug;
45			struct AllocatorNode;
46
47			Port				fPort;
48			AllocatorNode*		fCurrentAllocatorNode;
49};
50
51// RequestReleaser
52class RequestReleaser {
53public:
54	inline RequestReleaser(RequestPort* port, Request* request)
55		: fPort(port), fRequest(request) {}
56
57	inline ~RequestReleaser()
58	{
59		if (fPort && fRequest)
60			fPort->ReleaseRequest(fRequest);
61	}
62
63private:
64	RequestPort*	fPort;
65	Request*		fRequest;
66};
67
68}	// namespace UserlandFSUtil
69
70using UserlandFSUtil::RequestPort;
71using UserlandFSUtil::RequestReleaser;
72
73#endif	// USERLAND_FS_REQUEST_PORT_H
74