gallium: Use struct pipe_atomic for pipe refcounts.
authorThomas Hellstrom <thellstrom-at-vmware-dot-com>
Fri, 13 Mar 2009 14:47:18 +0000 (15:47 +0100)
committerThomas Hellstrom <thellstrom-at-vmware-dot-com>
Mon, 16 Mar 2009 10:40:47 +0000 (11:40 +0100)
Signed-off-by: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
src/gallium/auxiliary/pipebuffer/pb_buffer.h
src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c
src/gallium/drivers/softpipe/sp_texture.c
src/gallium/drivers/trace/tr_state.c
src/gallium/include/pipe/p_refcnt.h
src/mesa/state_tracker/st_texture.c

index f3a48d7ab0f303e6b486758518b982299c99cbf5..2a1315922a8cfb3e76d9cc112f166ad34999d2d2 100644 (file)
@@ -158,7 +158,7 @@ pb_map(struct pb_buffer *buf,
    assert(buf);
    if(!buf)
       return NULL;
-   assert(buf->base.reference.count > 0);
+   assert(p_atomic_read(&buf->base.reference.count) > 0);
    return buf->vtbl->map(buf, flags);
 }
 
@@ -169,7 +169,7 @@ pb_unmap(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
-   assert(buf->base.reference.count > 0);
+   assert(p_atomic_read(&buf->base.reference.count) > 0);
    buf->vtbl->unmap(buf);
 }
 
@@ -185,7 +185,7 @@ pb_get_base_buffer( struct pb_buffer *buf,
       offset = 0;
       return;
    }
-   assert(buf->base.reference.count > 0);
+   assert(p_atomic_read(&buf->base.reference.count) > 0);
    assert(buf->vtbl->get_base_buffer);
    buf->vtbl->get_base_buffer(buf, base_buf, offset);
    assert(*base_buf);
@@ -221,7 +221,7 @@ pb_destroy(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
-   assert(buf->base.reference.count == 0);
+   assert(p_atomic_read(&buf->base.reference.count) == 0);
    buf->vtbl->destroy(buf);
 }
 
index e4adf8aad7cdb24f42c34c621f13af311476bf55..1bdf7a0b2da7c89e211483ee656200c6510fa1ef 100644 (file)
@@ -115,7 +115,7 @@ _fenced_buffer_add(struct fenced_buffer *fenced_buf)
 {
    struct fenced_buffer_list *fenced_list = fenced_buf->list;
 
-   assert(fenced_buf->base.base.reference.count);
+   assert(p_atomic_read(&fenced_buf->base.base.reference.count));
    assert(fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE);
    assert(fenced_buf->fence);
 
@@ -137,7 +137,7 @@ _fenced_buffer_destroy(struct fenced_buffer *fenced_buf)
 {
    struct fenced_buffer_list *fenced_list = fenced_buf->list;
    
-   assert(!fenced_buf->base.base.reference.count);
+   assert(p_atomic_read(&fenced_buf->base.base.reference.count) == 0);
    assert(!fenced_buf->fence);
 #ifdef DEBUG
    assert(fenced_buf->head.prev);
@@ -177,7 +177,11 @@ _fenced_buffer_remove(struct fenced_buffer_list *fenced_list,
    ++fenced_list->numUnfenced;
 #endif
    
-   if(!fenced_buf->base.base.reference.count)
+   /**
+    * FIXME!!!
+    */
+
+   if(!p_atomic_read(&fenced_buf->base.base.reference.count))
       _fenced_buffer_destroy(fenced_buf);
 }
 
@@ -253,7 +257,7 @@ fenced_buffer_destroy(struct pb_buffer *buf)
    struct fenced_buffer_list *fenced_list = fenced_buf->list;
 
    pipe_mutex_lock(fenced_list->mutex);
-   assert(fenced_buf->base.base.reference.count == 0);
+   assert(p_atomic_read(&fenced_buf->base.base.reference.count) == 0);
    if (fenced_buf->fence) {
       struct pb_fence_ops *ops = fenced_list->ops;
       if(ops->fence_signalled(ops, fenced_buf->fence, 0) == 0) {
index 06ed0002ca8a42909202f8cec6c22f076ce04739..010a2ecc1fa7109990e08bd7b190f422d50b3f47 100644 (file)
@@ -112,7 +112,7 @@ _pb_cache_buffer_destroy(struct pb_cache_buffer *buf)
    LIST_DEL(&buf->head);
    assert(mgr->numDelayed);
    --mgr->numDelayed;
-   assert(!buf->base.base.reference.count);
+   assert(p_atomic_read(&buf->base.base.reference.count) == 0);
    pb_reference(&buf->buffer, NULL);
    FREE(buf);
 }
@@ -153,7 +153,7 @@ pb_cache_buffer_destroy(struct pb_buffer *_buf)
    struct pb_cache_manager *mgr = buf->mgr;
 
    pipe_mutex_lock(mgr->mutex);
-   assert(buf->base.base.reference.count == 0);
+   assert(p_atomic_read(&buf->base.base.reference.count) == 0);
    
    _pb_cache_buffer_list_check_free(mgr);
    
@@ -310,7 +310,7 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
       return NULL;
    }
    
-   assert(buf->buffer->base.reference.count >= 1);
+   assert(p_atomic_read(&buf->buffer->base.reference.count) >= 1);
    assert(pb_check_alignment(desc->alignment, buf->buffer->base.alignment));
    assert(pb_check_usage(desc->usage, buf->buffer->base.usage));
    assert(buf->buffer->base.size >= size);
index 37ed64b84f6994ba22d6293eadfb1222b94ace53..478682dbee9418abb5f9948bfd2f6e1972644ba0 100644 (file)
@@ -208,7 +208,7 @@ pb_debug_buffer_destroy(struct pb_buffer *_buf)
 {
    struct pb_debug_buffer *buf = pb_debug_buffer(_buf);
    
-   assert(!buf->base.base.reference.count);
+   assert(p_atomic_read(&buf->base.base.reference.count) == 0);
    
    pb_debug_buffer_check(buf);
 
@@ -315,7 +315,7 @@ pb_debug_manager_create_buffer(struct pb_manager *_mgr,
       return NULL;
    }
    
-   assert(buf->buffer->base.reference.count >= 1);
+   assert(p_atomic_read(&buf->buffer->base.reference.count) >= 1);
    assert(pb_check_alignment(real_desc.alignment, buf->buffer->base.alignment));
    assert(pb_check_usage(real_desc.usage, buf->buffer->base.usage));
    assert(buf->buffer->base.size >= real_size);
index 9b0f77bedb439c06d7de4886d8e3ba0736b5b4d2..fb18dcc5dcae37471e7a6608eeab6d5336ebef6e 100644 (file)
@@ -97,7 +97,7 @@ mm_buffer_destroy(struct pb_buffer *buf)
    struct mm_buffer *mm_buf = mm_buffer(buf);
    struct mm_pb_manager *mm = mm_buf->mgr;
    
-   assert(mm_buf->base.base.reference.count == 0);
+   assert(p_atomic_read(&mm_buf->base.base.reference.count) == 0);
    
    pipe_mutex_lock(mm->mutex);
    u_mmFreeMem(mm_buf->block);
index ca6c14a627e8df597b5ea37b27479f90f683a6c5..75b95e132e8d5987db273fce0ee4e422b69b4b2e 100644 (file)
@@ -108,7 +108,7 @@ pool_buffer_destroy(struct pb_buffer *buf)
    struct pool_buffer *pool_buf = pool_buffer(buf);
    struct pool_pb_manager *pool = pool_buf->mgr;
    
-   assert(pool_buf->base.base.reference.count == 0);
+   assert(p_atomic_read(&pool_buf->base.base.reference.count) == 0);
 
    pipe_mutex_lock(pool->mutex);
    LIST_ADD(&pool_buf->head, &pool->free);
@@ -216,7 +216,7 @@ pool_bufmgr_create_buffer(struct pb_manager *mgr,
    pipe_mutex_unlock(pool->mutex);
    
    pool_buf = LIST_ENTRY(struct pool_buffer, item, head);
-   assert(pool_buf->base.base.reference.count == 0);
+   assert(p_atomic_read(&pool_buf->base.base.reference.count) == 0);
    pipe_reference_init(&pool_buf->base.base.reference, 1);
    pool_buf->base.base.alignment = desc->alignment;
    pool_buf->base.base.usage = desc->usage;
index 2cdb5a5e29d7266cc8254b166ea8df5f0663da78..a431fd5211e439b7a45a1dab8410d22eb9fc5414 100644 (file)
@@ -202,7 +202,7 @@ pb_slab_buffer_destroy(struct pb_buffer *_buf)
 
    pipe_mutex_lock(mgr->mutex);
    
-   assert(buf->base.base.reference.count == 0);
+   assert(p_atomic_read(&buf->base.base.reference.count) == 0);
    
    buf->mapCount = 0;
 
index 4919ec826e9811901c22c4e8b1465e44bd5a9d72..ade18b2333235c814bf3641e51d8eec4feb2e613 100644 (file)
@@ -138,7 +138,7 @@ softpipe_texture_create(struct pipe_screen *screen,
          goto fail;
    }
     
-   assert(spt->base.reference.count == 1);
+   assert(atomic_read(&spt->base.reference.count) == 1);
    return &spt->base;
 
  fail:
index c305b09335409fea01da412c1bc400ac6dd99514..b6a1ce0d6252a6830da8afdc336200ac076ef109 100644 (file)
@@ -53,7 +53,7 @@ void trace_dump_block(const struct pipe_format_block *block)
 static void trace_dump_reference(const struct pipe_reference *reference)
 {
    trace_dump_struct_begin("pipe_reference");
-   trace_dump_member(uint, reference, count);
+   trace_dump_member(int, &reference->count, count);
    trace_dump_struct_end();
 }
 
index 27b4e8fbfedfc164a75b3fba65a23a20532a0c07..60844e40a577d7b751adbe3ee5b2f7321ad8e890 100644 (file)
@@ -30,6 +30,7 @@
 
 
 #include "p_defines.h"
+#include "p_atomic.h"
 
 
 #ifdef __cplusplus
@@ -39,14 +40,14 @@ extern "C" {
 
 struct pipe_reference
 {
-   unsigned count;
+   struct pipe_atomic count;
 };
 
 
 static INLINE void
 pipe_reference_init(struct pipe_reference *reference, unsigned count)
 {
-   reference->count = count;
+   p_atomic_set(&reference->count, count);
 }
 
 
@@ -64,13 +65,13 @@ pipe_reference(struct pipe_reference **ptr, struct pipe_reference *reference)
 
    /* bump the reference.count first */
    if (reference) {
-      assert(reference->count);
-      reference->count++;
+      assert(p_atomic_read(&reference->count) != 0);
+      p_atomic_inc(&reference->count);
    }
 
    if (*ptr) {
-      assert((*ptr)->count);
-      if (--(*ptr)->count == 0) {
+      assert(p_atomic_read(&(*ptr)->count) != 0);
+      if (p_atomic_dec_zero(&(*ptr)->count)) {
          destroy = TRUE;
       }
    }
index 30b95bebab3ab8a836d1de38ccafbd4948f50f2e..b9b5baed149886d4e5e21f2d437e269a88dd8a10 100644 (file)
@@ -107,7 +107,7 @@ st_texture_create(struct st_context *st,
 
    newtex = screen->texture_create(screen, &pt);
 
-   assert(!newtex || newtex->reference.count == 1);
+   assert(!newtex || p_atomic_read(&newtex->reference.count) == 1);
 
    return newtex;
 }