diff options
author | Max Kellermann <max@duempel.org> | 2013-01-04 16:26:41 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-01-04 17:12:21 +0100 |
commit | e3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab (patch) | |
tree | 2b04bdd9745699a8fca6c84f50b9ed71703a9833 /src/MusicBuffer.cxx | |
parent | f0be6a4b9edf193a018f0e671106616f6f8dd30c (diff) | |
download | mpd-e3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab.tar.gz mpd-e3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab.tar.xz mpd-e3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab.zip |
MusicBuffer: move code to template class SliceBuffer
Diffstat (limited to 'src/MusicBuffer.cxx')
-rw-r--r-- | src/MusicBuffer.cxx | 72 |
1 files changed, 12 insertions, 60 deletions
diff --git a/src/MusicBuffer.cxx b/src/MusicBuffer.cxx index e90344aed..ec6e52054 100644 --- a/src/MusicBuffer.cxx +++ b/src/MusicBuffer.cxx @@ -20,53 +20,22 @@ #include "config.h" #include "MusicBuffer.hxx" #include "MusicChunk.hxx" +#include "util/SliceBuffer.hxx" #include <glib.h> #include <assert.h> -struct music_buffer { - struct music_chunk *chunks; - unsigned num_chunks; - - struct music_chunk *available; - +struct music_buffer : public SliceBuffer<music_chunk> { /** a mutex which protects #available */ GMutex *mutex; -#ifndef NDEBUG - unsigned num_allocated; -#endif - - music_buffer(unsigned _num_chunks) - :chunks(g_new(struct music_chunk, _num_chunks)), - num_chunks(_num_chunks), - available(chunks), - mutex(g_mutex_new()) -#ifndef NDEBUG - , num_allocated(0) -#endif - { - assert(num_chunks > 0); - - struct music_chunk *chunk; - chunk = available = chunks; - - for (unsigned i = 1; i < num_chunks; ++i) { - chunk->next = &chunks[i]; - chunk = chunk->next; - } - - chunk->next = nullptr; - } + music_buffer(unsigned num_chunks) + :SliceBuffer(num_chunks), + mutex(g_mutex_new()) {} ~music_buffer() { - assert(chunks != nullptr); - assert(num_chunks > 0); - assert(num_allocated == 0); - g_mutex_free(mutex); - g_free(chunks); } }; @@ -85,26 +54,14 @@ music_buffer_free(struct music_buffer *buffer) unsigned music_buffer_size(const struct music_buffer *buffer) { - return buffer->num_chunks; + return buffer->GetCapacity(); } struct music_chunk * music_buffer_allocate(struct music_buffer *buffer) { - struct music_chunk *chunk; - g_mutex_lock(buffer->mutex); - - chunk = buffer->available; - if (chunk != NULL) { - buffer->available = chunk->next; - music_chunk_init(chunk); - -#ifndef NDEBUG - ++buffer->num_allocated; -#endif - } - + struct music_chunk *chunk = buffer->Allocate(); g_mutex_unlock(buffer->mutex); return chunk; } @@ -115,19 +72,14 @@ music_buffer_return(struct music_buffer *buffer, struct music_chunk *chunk) assert(buffer != NULL); assert(chunk != NULL); - if (chunk->other != NULL) - music_buffer_return(buffer, chunk->other); - g_mutex_lock(buffer->mutex); - music_chunk_free(chunk); - - chunk->next = buffer->available; - buffer->available = chunk; + if (chunk->other != nullptr) { + assert(chunk->other->other == nullptr); + buffer->Free(chunk->other); + } -#ifndef NDEBUG - --buffer->num_allocated; -#endif + buffer->Free(chunk); g_mutex_unlock(buffer->mutex); } |