xref: /haiku/src/servers/media/BufferManager.h (revision 3c6e2dd68577c34d93e17f19711f6245bf6d0915)
1 /*
2  * Copyright 2002, Marcus Overhagen. All rights reserved.
3  * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include <set>
9 
10 #include <Locker.h>
11 #include <MediaDefs.h>
12 
13 #include <HashMap.h>
14 
15 
16 namespace BPrivate {
17 	class SharedBufferList;
18 }
19 
20 
21 class BufferManager {
22 public:
23 							BufferManager();
24 							~BufferManager();
25 
26 			area_id			SharedBufferListArea();
27 
28 			status_t		RegisterBuffer(team_id team,
29 								media_buffer_id bufferID, size_t* _size,
30 								int32* _flags, size_t* _offset, area_id* _area);
31 
32 			status_t		RegisterBuffer(team_id team, size_t size,
33 								int32 flags, size_t offset, area_id area,
34 								media_buffer_id* _bufferID);
35 
36 			status_t		UnregisterBuffer(team_id team,
37 								media_buffer_id bufferID);
38 
39 			void			CleanupTeam(team_id team);
40 
41 			void			Dump();
42 
43 private:
44 			area_id			_CloneArea(area_id area);
45 			void			_ReleaseClonedArea(area_id clone);
46 
47 private:
48 	struct clone_info {
49 		area_id				clone;
50 		vint32				ref_count;
51 	};
52 
53 	struct buffer_info {
54 		media_buffer_id		id;
55 		area_id				area;
56 		size_t				offset;
57 		size_t				size;
58 		int32				flags;
59 		std::set<team_id>	teams;
60 	};
61 
62 	template<typename Type> struct id_hash {
63 		id_hash()
64 			:
65 			fID(0)
66 		{
67 		}
68 
69 		id_hash(Type id)
70 			:
71 			fID(id)
72 		{
73 		}
74 
75 		id_hash(const id_hash& other)
76 		{
77 			fID = other.fID;
78 		}
79 
80 		uint32 GetHashCode() const
81 		{
82 			return fID;
83 		}
84 
85 		operator Type() const
86 		{
87 			return fID;
88 		}
89 
90 		id_hash& operator=(const id_hash& other)
91 		{
92 			fID = other.fID;
93 			return *this;
94 		}
95 
96 	private:
97 		Type	fID;
98 	};
99 
100 	typedef HashMap<id_hash<media_buffer_id>, buffer_info> BufferInfoMap;
101 	typedef HashMap<id_hash<area_id>, clone_info> CloneInfoMap;
102 	typedef HashMap<id_hash<area_id>, area_id> SourceInfoMap;
103 
104 			BPrivate::SharedBufferList* fSharedBufferList;
105 			area_id			fSharedBufferListArea;
106 			media_buffer_id	fNextBufferID;
107 			BLocker			fLocker;
108 			BufferInfoMap	fBufferInfoMap;
109 			CloneInfoMap	fCloneInfoMap;
110 			SourceInfoMap	fSourceInfoMap;
111 };
112 
113