⛏️ index : haiku.git

// RequestPortPool.h

#ifndef USERLAND_FS_REQUEST_PORT_POOL_H
#define USERLAND_FS_REQUEST_PORT_POOL_H

#include <OS.h>

#include "Locker.h"

namespace UserlandFSUtil {

class RequestPort;

}

using UserlandFSUtil::RequestPort;

class RequestPortPool : public Locker {
public:
								RequestPortPool();
								~RequestPortPool();

			status_t			InitCheck() const;

			bool				IsDisconnected() const;

			status_t			AddPort(RequestPort* port);

			RequestPort*		AcquirePort();
			void				ReleasePort(RequestPort* port);

private:
			friend class KernelDebug;

			struct PortAcquirationInfo {
				RequestPort*	port;
				thread_id		owner;
				int32			count;
			};

			PortAcquirationInfo*	fPorts;
			int32				fPortCount;
			int32				fFreePorts;
			sem_id				fFreePortSemaphore;
			volatile bool		fDisconnected;
};

#endif	// USERLAND_FS_REQUEST_PORT_POOL_H