MusicBuffer: move code to template class SliceBuffer

This commit is contained in:
Max Kellermann
2013-01-04 16:26:41 +01:00
parent f0be6a4b9e
commit e3a2bd3a1e
3 changed files with 147 additions and 60 deletions

View File

@@ -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);
if (chunk->other != nullptr) {
assert(chunk->other->other == nullptr);
buffer->Free(chunk->other);
}
chunk->next = buffer->available;
buffer->available = chunk;
#ifndef NDEBUG
--buffer->num_allocated;
#endif
buffer->Free(chunk);
g_mutex_unlock(buffer->mutex);
}