From dce7ab66d94e7fab3ec459876d0af977caade6b9 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Tue, 23 Mar 2010 19:00:11 +1000
Subject: [PATCH] gallium: add is_busy flag to cached bufmgr.

---
 src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
index 0f2ae05..9cac8da 100644
--- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
+++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
@@ -225,10 +225,12 @@ pb_cache_buffer_vtbl = {
 static INLINE boolean
 pb_cache_is_buffer_compat(struct pb_cache_buffer *buf,  
                           pb_size size,
-                          const struct pb_desc *desc)
+                          const struct pb_desc *desc,
+			  boolean *is_busy)
 {
    void *map;
 
+   *is_busy = FALSE;
    if(buf->base.base.size < size)
       return FALSE;
 
@@ -244,6 +246,7 @@ pb_cache_is_buffer_compat(struct pb_cache_buffer *buf,
 
    map = pb_map(buf->buffer, PIPE_BUFFER_USAGE_DONTBLOCK);
    if (!map) {
+      *is_busy = TRUE;
       return FALSE;
    }
 
@@ -263,6 +266,7 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
    struct pb_cache_buffer *curr_buf;
    struct list_head *curr, *next;
    int64_t now;
+   boolean is_busy;
    
    pipe_mutex_lock(mgr->mutex);
 
@@ -274,25 +278,32 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
    now = os_time_get();
    while(curr != &mgr->delayed) {
       curr_buf = LIST_ENTRY(struct pb_cache_buffer, curr, head);
-      if(!buf && pb_cache_is_buffer_compat(curr_buf, size, desc))
+      if(!buf && pb_cache_is_buffer_compat(curr_buf, size, desc, &is_busy))
 	 buf = curr_buf;
       else if(os_time_timeout(curr_buf->start, curr_buf->end, now))
 	 _pb_cache_buffer_destroy(curr_buf);
       else
          /* This buffer (and all hereafter) are still hot in cache */
          break;
+
+      if (is_busy)
+	 break;
+
       curr = next; 
       next = curr->next;
    }
 
    /* keep searching in the hot buffers */
-   if(!buf) {
+   if(!buf && !is_busy) {
       while(curr != &mgr->delayed) {
          curr_buf = LIST_ENTRY(struct pb_cache_buffer, curr, head);
-         if(pb_cache_is_buffer_compat(curr_buf, size, desc)) {
+         if(pb_cache_is_buffer_compat(curr_buf, size, desc, &is_busy)) {
             buf = curr_buf;
             break;
          }
+
+	 if (is_busy)
+	    break;
          /* no need to check the timeout here */
          curr = next;
          next = curr->next;
-- 
1.6.6.1

