OSDN Git Service

Change buffer reuse policy to MRU to hopefully improve cache and VM performance.
authoreddyg <eddyg@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Fri, 29 Aug 2008 00:16:22 +0000 (00:16 +0000)
committereddyg <eddyg@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Fri, 29 Aug 2008 00:16:22 +0000 (00:16 +0000)
git-svn-id: svn://localhost/HandBrake/trunk@1659 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/fifo.c
libhb/internal.h

index 1bf2a9d..ea2a292 100644 (file)
@@ -190,7 +190,7 @@ void hb_buffer_close( hb_buffer_t ** _b )
 
     if( buffer_pool && b->data && !hb_fifo_is_full( buffer_pool ) )
     {
-        hb_fifo_push( buffer_pool, b );
+        hb_fifo_push_head( buffer_pool, b );
         return;
     }
     /* either the pool is full or this size doesn't use a pool - free the buf */
@@ -334,6 +334,43 @@ void hb_fifo_push( hb_fifo_t * f, hb_buffer_t * b )
     hb_unlock( f->lock );
 }
 
+void hb_fifo_push_head( hb_fifo_t * f, hb_buffer_t * b )
+{
+    hb_buffer_t * tmp;
+    uint32_t      size = 0;
+
+    if( !b )
+    {
+        return;
+    }
+
+    hb_lock( f->lock );
+
+    /*
+     * If there are a chain of buffers prepend the lot
+     */
+    tmp = b;
+    while( tmp->next )
+    {
+        tmp = tmp->next;
+        size += 1;
+    }
+
+    if( f->size > 0 )
+    {
+        tmp->next = f->first;
+    } 
+    else
+    {
+        f->last = tmp;
+    }
+
+    f->first = b;
+    f->size += ( size + 1 );
+
+    hb_unlock( f->lock );
+}
+
 void hb_fifo_close( hb_fifo_t ** _f )
 {
     hb_fifo_t   * f = *_f;
index 36dca0d..5f04e38 100644 (file)
@@ -85,6 +85,7 @@ hb_buffer_t * hb_fifo_get( hb_fifo_t * );
 hb_buffer_t * hb_fifo_see( hb_fifo_t * );
 hb_buffer_t * hb_fifo_see2( hb_fifo_t * );
 void          hb_fifo_push( hb_fifo_t *, hb_buffer_t * );
+void          hb_fifo_push_head( hb_fifo_t *, hb_buffer_t * );
 void          hb_fifo_close( hb_fifo_t ** );
 
 /***********************************************************************