Fix "out of buffers" crash (#3783)

Remove BufferManager implementation. Use MemoryManager allocation instead and re-use buffers where they are allocated (AudioPort.cpp & PlayHandle.cpp)
This commit is contained in:
Lukas W
2017-09-26 20:33:09 +02:00
committed by GitHub
parent dd429c5caf
commit f23cf4e0bf
9 changed files with 60 additions and 116 deletions

View File

@@ -30,9 +30,6 @@
#include "export.h"
#include "lmms_basics.h"
const int BM_INITIAL_BUFFERS = 512;
//const int BM_INCREMENT = 64;
class EXPORT BufferManager
{
public:
@@ -46,17 +43,6 @@ public:
const f_cnt_t offset = 0 );
#endif
static void release( sampleFrame * buf );
static void refresh();
// static void extend( int c );
private:
static sampleFrame ** s_available;
static AtomicInt s_availableIndex;
static sampleFrame ** s_released;
static AtomicInt s_releasedIndex;
// static QReadWriteLock s_mutex;
static int s_size;
};
#endif

View File

@@ -31,7 +31,7 @@
class MemoryHelper {
public:
static void* alignedMalloc( int );
static void* alignedMalloc( size_t );
static void alignedFree( void* );

View File

@@ -42,7 +42,7 @@ struct MemoryPool
{
void * m_pool;
char * m_free;
int m_chunks;
size_t m_chunks;
QMutex m_mutex;
MemoryPool() :
@@ -51,10 +51,10 @@ struct MemoryPool
m_chunks( 0 )
{}
MemoryPool( int chunks ) :
MemoryPool( size_t chunks ) :
m_chunks( chunks )
{
m_free = (char*) MemoryHelper::alignedMalloc( chunks );
m_free = reinterpret_cast<char*>( MemoryHelper::alignedMalloc( chunks ) );
memset( m_free, 1, chunks );
}
@@ -103,6 +103,25 @@ private:
static QMutex s_pointerMutex;
};
template<typename T>
struct MmAllocator
{
typedef T value_type;
template<class U> struct rebind { typedef MmAllocator<U> other; };
T* allocate( std::size_t n )
{
return reinterpret_cast<T*>( MemoryManager::alloc( sizeof(T) * n ) );
}
void deallocate( T* p, std::size_t )
{
MemoryManager::free( p );
}
typedef std::vector<T, MmAllocator<T> > vector;
};
#define MM_OPERATORS \
public: \
@@ -124,7 +143,7 @@ static void operator delete[] ( void * ptr ) \
}
// for use in cases where overriding new/delete isn't a possibility
#define MM_ALLOC( type, count ) (type*) MemoryManager::alloc( sizeof( type ) * count )
#define MM_ALLOC( type, count ) reinterpret_cast<type*>( MemoryManager::alloc( sizeof( type ) * count ) )
// and just for symmetry...
#define MM_FREE( ptr ) MemoryManager::free( ptr )

View File

@@ -28,6 +28,8 @@
#include <QtCore/QList>
#include <QtCore/QMutex>
#include "MemoryManager.h"
#include "ThreadableJob.h"
#include "lmms_basics.h"
@@ -142,20 +144,17 @@ public:
void releaseBuffer();
sampleFrame * buffer()
{
return m_playHandleBuffer;
}
sampleFrame * buffer();
private:
Type m_type;
f_cnt_t m_offset;
QThread* m_affinity;
QMutex m_processingLock;
sampleFrame * m_playHandleBuffer;
sampleFrame* m_playHandleBuffer;
bool m_bufferReleased;
bool m_usesBuffer;
AudioPort * m_audioPort;
} ;