xref: /haiku/src/kits/media/PortPool.cpp (revision 083314c2cbfa9459cfc3e55873f04050f238be90)
1 /*
2  * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <set>
8 
9 #include <Autolock.h>
10 #include <Locker.h>
11 
12 #include <MediaDebug.h>
13 
14 #include "PortPool.h"
15 
16 
17 namespace BPrivate {
18 namespace media {
19 
20 
21 PortPool* gPortPool;
22 	// managed by MediaRosterUndertaker.
23 
24 
PortPool()25 PortPool::PortPool()
26 	:
27 	BLocker("port pool")
28 {
29 }
30 
31 
~PortPool()32 PortPool::~PortPool()
33 {
34 	PortSet::iterator iterator = fPool.begin();
35 
36 	for (; iterator != fPool.end(); iterator++)
37 		delete_port(*iterator);
38 }
39 
40 
41 port_id
GetPort()42 PortPool::GetPort()
43 {
44 	BAutolock _(this);
45 
46 	if (fPool.empty())
47 		return create_port(1, "media reply port");
48 
49 	port_id port = *fPool.begin();
50 	fPool.erase(port);
51 
52 	ASSERT(port >= 0);
53 	return port;
54 }
55 
56 
57 void
PutPort(port_id port)58 PortPool::PutPort(port_id port)
59 {
60 	ASSERT(port >= 0);
61 
62 	BAutolock _(this);
63 
64 	try {
65 		fPool.insert(port);
66 	} catch (std::bad_alloc& exception) {
67 		delete_port(port);
68 	}
69 }
70 
71 
72 }	// namespace media
73 }	// namespace BPrivate
74