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