00001 00005 #include "BasicDataBuffer.hpp" 00006 #include "errorhandler.hpp" 00007 #include "toolbox.hpp" 00008 00009 00010 // **************************************************************************** 00011 // Buffer fuer BasicData 00012 // **************************************************************************** 00013 BasicDataBuffer::BasicDataBuffer() 00014 : m_beVerbose(false) 00015 , m_bytesMax(0) 00016 , m_bytesUsed(0) 00017 { 00018 infoMessage("BasicDataBuffer: Starting constructor.", m_beVerbose); 00019 00020 infoMessage("BasicDataBuffer(): Constructor is done.", m_beVerbose); 00021 } 00022 00023 BasicDataBuffer::~BasicDataBuffer() 00024 { 00025 infoMessage("~BasicDataBuffer(): Destructor called.", m_beVerbose); 00026 00027 00028 infoMessage("~BasicDataBuffer(): Destructor is done - object is dead.", m_beVerbose); 00029 } 00030 00037 void BasicDataBuffer::setLimit(UINT32 maxBytesToBeUsed) 00038 { 00039 m_bytesMax = maxBytesToBeUsed; 00040 } 00041 00042 00047 UINT32 BasicDataBuffer::getUsedBytes() 00048 { 00049 return m_bytesUsed; 00050 } 00051 00056 UINT32 BasicDataBuffer::getBufferSize() 00057 { 00058 return m_buffer.size(); 00059 } 00060 00061 // 00062 // Speichert den Zeiger (!) auf das Datum im Puffer, sofern der Platz im Puffer (mitgerechnet 00063 // wird der Speicherplatz des Daten-Objekts) noch reicht. 00064 // 00065 // true: Datum wurde gespeichert. 00066 // 00067 bool BasicDataBuffer::pushData(BasicData* data) 00068 { 00069 ScopedLock lock(&m_mutex); // .lock(); 00070 00071 // Gibt es ein Limit? 00072 UINT32 sizeOfNewData = data->getUsedMemory(); 00073 if (m_bytesMax > 0) 00074 { 00075 // Es gibt ein Limit, also pruefen 00076 UINT32 newSize = m_bytesUsed + sizeOfNewData; // sizeof(*data); 00077 if (newSize > m_bytesMax) 00078 { 00079 // Das Limit wird ueberschritten, also dieses Datum ablehnen. 00080 m_mutex.unlock(); 00081 return false; 00082 } 00083 } 00084 00085 // Datum speichern 00086 m_buffer.push_back(data); 00087 m_bytesUsed += sizeOfNewData; 00088 00089 // m_mutex.unlock(); 00090 return true; 00091 } 00092 00093 // 00094 // Liefert den Zeiger auf das aelteste Datum im Puffer. War kein Datum vorhanden, ist der Zeiger NULL. 00095 // 00096 // Die Bytes-Used-Verwaltung funktioniert nicht, falls die Daten im Puffer von der Applikation veraendert werden. 00097 // Dann werden naemlich eine andere Anzahl Bytes entfernt, als hinzugefuegt wurden... 00098 // 00099 BasicData* BasicDataBuffer::popData() 00100 { 00101 ScopedLock lock(&m_mutex); 00102 00103 BasicData* data = NULL; 00104 00105 // Sind noch Daten im Puffer? 00106 if (m_buffer.size() > 0) 00107 { 00108 data = m_buffer.front(); 00109 m_buffer.pop_front(); 00110 m_bytesUsed -= data->getUsedMemory(); 00111 } 00112 00113 // m_mutex.unlock(); 00114 return data; 00115 }