cached BBuffer object are not allowed to be deleted until they are Recycled,
temporary changed to never delete them... git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4541 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -10,75 +10,36 @@
|
|||||||
#include "BufferIdCache.h"
|
#include "BufferIdCache.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
_buffer_id_cache::_buffer_id_cache() :
|
// XXX we are not allowed to delete BBuffer objects when they are not recycled
|
||||||
in_use(0),
|
|
||||||
used(0),
|
_buffer_id_cache::_buffer_id_cache()
|
||||||
stat_missed(0),
|
|
||||||
stat_hit(0)
|
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_CACHED_BUFFER; i++) {
|
|
||||||
info[i].buffer = 0;
|
|
||||||
info[i].id = 0;
|
|
||||||
info[i].last_used = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_buffer_id_cache::~_buffer_id_cache()
|
_buffer_id_cache::~_buffer_id_cache()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_CACHED_BUFFER; i++)
|
// XXX deleting buffers here is not save, too
|
||||||
if (info[i].buffer)
|
/*
|
||||||
delete info[i].buffer;
|
fMap.Rewind();
|
||||||
TRACE("### _buffer_id_cache finished, %ld in_use, %ld used, %ld hit, %ld missed\n",in_use,used,stat_hit,stat_missed);
|
BBuffer **buffer;
|
||||||
|
while (fMap.GetNext(&buffer)) {
|
||||||
|
fMap.RemoveCurrent();
|
||||||
|
delete *buffer;
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
BBuffer *
|
BBuffer *
|
||||||
_buffer_id_cache::GetBuffer(media_buffer_id id)
|
_buffer_id_cache::GetBuffer(media_buffer_id id)
|
||||||
{
|
{
|
||||||
if (id == 0)
|
BBuffer **buffer;
|
||||||
debugger("_buffer_id_cache::GetBuffer called with 0 id\n");
|
if (fMap.Get(id, &buffer))
|
||||||
|
return *buffer;
|
||||||
used++;
|
|
||||||
|
|
||||||
// try to find in cache
|
|
||||||
for (int i = 0; i < MAX_CACHED_BUFFER; i++) {
|
|
||||||
if (info[i].id == id) {
|
|
||||||
stat_hit++;
|
|
||||||
info[i].last_used = used;
|
|
||||||
return info[i].buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stat_missed++;
|
|
||||||
|
|
||||||
// remove last recently used
|
|
||||||
if (in_use == MAX_CACHED_BUFFER) {
|
|
||||||
int32 min_last_used = used;
|
|
||||||
int index = 0;
|
|
||||||
for (int i = 0; i < MAX_CACHED_BUFFER; i++) {
|
|
||||||
if (info[i].last_used < min_last_used) {
|
|
||||||
min_last_used = info[i].last_used;
|
|
||||||
index = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete info[index].buffer;
|
|
||||||
info[index].buffer = NULL;
|
|
||||||
in_use--;
|
|
||||||
}
|
|
||||||
|
|
||||||
BBuffer *buffer;
|
|
||||||
buffer_clone_info ci;
|
buffer_clone_info ci;
|
||||||
ci.buffer = id;
|
ci.buffer = id;
|
||||||
buffer = new BBuffer(ci);
|
BBuffer *buf = new BBuffer(ci);
|
||||||
|
|
||||||
// insert into cache
|
fMap.Insert(id, buf);
|
||||||
for (int i = 0; i < MAX_CACHED_BUFFER; i++) {
|
return buf;
|
||||||
if (info[i].buffer == NULL) {
|
|
||||||
info[i].buffer = buffer;
|
|
||||||
info[i].id = id;
|
|
||||||
info[i].last_used = used;
|
|
||||||
in_use++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return buffer;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
#ifndef _BUFFER_ID_CACHE_H_
|
#ifndef _BUFFER_ID_CACHE_H_
|
||||||
#define _BUFFER_ID_CACHE_H_
|
#define _BUFFER_ID_CACHE_H_
|
||||||
|
|
||||||
|
#include "TMap.h"
|
||||||
|
|
||||||
class _buffer_id_cache
|
class _buffer_id_cache
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -17,18 +19,7 @@ public:
|
|||||||
BBuffer *GetBuffer(media_buffer_id id);
|
BBuffer *GetBuffer(media_buffer_id id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum { MAX_CACHED_BUFFER = 17 };
|
Map<media_buffer_id, BBuffer *> fMap;
|
||||||
struct _buffer_id_info
|
|
||||||
{
|
|
||||||
BBuffer *buffer;
|
|
||||||
media_buffer_id id;
|
|
||||||
int32 last_used;
|
|
||||||
};
|
|
||||||
_buffer_id_info info[MAX_CACHED_BUFFER];
|
|
||||||
int32 in_use;
|
|
||||||
int32 used;
|
|
||||||
int32 stat_missed;
|
|
||||||
int32 stat_hit;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user