aboutsummaryrefslogtreecommitdiffstats
path: root/src/MusicBuffer.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-01-04 16:26:41 +0100
committerMax Kellermann <max@duempel.org>2013-01-04 17:12:21 +0100
commite3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab (patch)
tree2b04bdd9745699a8fca6c84f50b9ed71703a9833 /src/MusicBuffer.cxx
parentf0be6a4b9edf193a018f0e671106616f6f8dd30c (diff)
downloadmpd-e3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab.tar.gz
mpd-e3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab.tar.xz
mpd-e3a2bd3a1ee935e40ba2d5a58bc3992b6ee2deab.zip
MusicBuffer: move code to template class SliceBuffer
Diffstat (limited to '')
-rw-r--r--src/MusicBuffer.cxx72
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);
}