*/
#include "os/os_mman.h"
+#include "util/hash_table.h"
#include "etnaviv_priv.h"
#include "etnaviv_drmif.h"
-pthread_mutex_t table_lock = PTHREAD_MUTEX_INITIALIZER;
-void bo_del(struct etna_bo *bo);
+pthread_mutex_t etna_drm_table_lock = PTHREAD_MUTEX_INITIALIZER;
+void _etna_bo_del(struct etna_bo *bo);
-/* set buffer name, and add to table, call w/ table_lock held: */
+/* set buffer name, and add to table, call w/ etna_drm_table_lock held: */
static void set_name(struct etna_bo *bo, uint32_t name)
{
bo->name = name;
/* add ourself into the name table: */
- drmHashInsert(bo->dev->name_table, name, bo);
+ _mesa_hash_table_insert(bo->dev->name_table, &bo->name, bo);
}
-/* Called under table_lock */
-void bo_del(struct etna_bo *bo)
+/* Called under etna_drm_table_lock */
+void _etna_bo_del(struct etna_bo *bo)
{
if (bo->map)
os_munmap(bo->map, bo->size);
- if (bo->name)
- drmHashDelete(bo->dev->name_table, bo->name);
-
if (bo->handle) {
struct drm_gem_close req = {
.handle = bo->handle,
};
- drmHashDelete(bo->dev->handle_table, bo->handle);
+ if (bo->name)
+ _mesa_hash_table_remove_key(bo->dev->name_table, &bo->name);
+
+ _mesa_hash_table_remove_key(bo->dev->handle_table, &bo->handle);
drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &req);
}
free(bo);
}
-/* lookup a buffer from it's handle, call w/ table_lock held: */
+/* lookup a buffer from it's handle, call w/ etna_drm_table_lock held: */
static struct etna_bo *lookup_bo(void *tbl, uint32_t handle)
{
struct etna_bo *bo = NULL;
+ struct hash_entry *entry = _mesa_hash_table_search(tbl, &handle);
- if (!drmHashLookup(tbl, handle, (void **)&bo)) {
+ if (entry) {
/* found, incr refcnt and return: */
- bo = etna_bo_ref(bo);
+ bo = etna_bo_ref(entry->data);
/* don't break the bucket if this bo was found in one */
list_delinit(&bo->list);
return bo;
}
-/* allocate a new buffer object, call w/ table_lock held */
+/* allocate a new buffer object, call w/ etna_drm_table_lock held */
static struct etna_bo *bo_from_handle(struct etna_device *dev,
uint32_t size, uint32_t handle, uint32_t flags)
{
p_atomic_set(&bo->refcnt, 1);
list_inithead(&bo->list);
/* add ourselves to the handle table: */
- drmHashInsert(dev->handle_table, handle, bo);
+ _mesa_hash_table_insert(dev->handle_table, &bo->handle, bo);
return bo;
}
if (ret)
return NULL;
- pthread_mutex_lock(&table_lock);
+ pthread_mutex_lock(&etna_drm_table_lock);
bo = bo_from_handle(dev, size, req.handle, flags);
bo->reuse = 1;
- pthread_mutex_unlock(&table_lock);
+ pthread_mutex_unlock(&etna_drm_table_lock);
return bo;
}
.name = name,
};
- pthread_mutex_lock(&table_lock);
+ pthread_mutex_lock(&etna_drm_table_lock);
/* check name table first, to see if bo is already open: */
bo = lookup_bo(dev->name_table, name);
set_name(bo, name);
out_unlock:
- pthread_mutex_unlock(&table_lock);
+ pthread_mutex_unlock(&etna_drm_table_lock);
return bo;
}
* racing against etna_bo_del, which might invalidate the
* returned handle.
*/
- pthread_mutex_lock(&table_lock);
+ pthread_mutex_lock(&etna_drm_table_lock);
ret = drmPrimeFDToHandle(dev->fd, fd, &handle);
if (ret) {
- pthread_mutex_unlock(&table_lock);
+ pthread_mutex_unlock(&etna_drm_table_lock);
return NULL;
}
bo = bo_from_handle(dev, size, handle, 0);
out_unlock:
- pthread_mutex_unlock(&table_lock);
+ pthread_mutex_unlock(&etna_drm_table_lock);
return bo;
}
/* destroy a buffer object */
void etna_bo_del(struct etna_bo *bo)
{
- struct etna_device *dev = bo->dev;
-
if (!bo)
return;
+ struct etna_device *dev = bo->dev;
+
if (!p_atomic_dec_zero(&bo->refcnt))
return;
- pthread_mutex_lock(&table_lock);
+ pthread_mutex_lock(&etna_drm_table_lock);
if (bo->reuse && (etna_bo_cache_free(&dev->bo_cache, bo) == 0))
goto out;
- bo_del(bo);
+ _etna_bo_del(bo);
etna_device_del_locked(dev);
out:
- pthread_mutex_unlock(&table_lock);
+ pthread_mutex_unlock(&etna_drm_table_lock);
}
/* get the global flink/DRI2 buffer name */
return ret;
}
- pthread_mutex_lock(&table_lock);
+ pthread_mutex_lock(&etna_drm_table_lock);
set_name(bo, req.name);
- pthread_mutex_unlock(&table_lock);
+ pthread_mutex_unlock(&etna_drm_table_lock);
bo->reuse = 0;
}