gallium/hash_table: consolidate hash tables with FD keys

Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3722>
This commit is contained in:
Marek Olšák 2020-02-05 14:27:21 -05:00 committed by Marge Bot
parent a01a875081
commit 76dff2fabe
8 changed files with 58 additions and 142 deletions

View file

@ -47,6 +47,10 @@
#include "util/u_hash_table.h"
#include "util/hash_table.h"
#if DETECT_OS_UNIX
#include <sys/stat.h>
#endif
struct util_hash_table
{
@ -116,6 +120,47 @@ util_hash_table_create_ptr_keys(void)
}
static unsigned hash_fd(void *key)
{
#if DETECT_OS_UNIX
int fd = pointer_to_intptr(key);
struct stat stat;
fstat(fd, &stat);
return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
#else
return 0;
#endif
}
static int compare_fd(void *key1, void *key2)
{
#if DETECT_OS_UNIX
int fd1 = pointer_to_intptr(key1);
int fd2 = pointer_to_intptr(key2);
struct stat stat1, stat2;
fstat(fd1, &stat1);
fstat(fd2, &stat2);
return stat1.st_dev != stat2.st_dev ||
stat1.st_ino != stat2.st_ino ||
stat1.st_rdev != stat2.st_rdev;
#else
return 0;
#endif
}
struct util_hash_table *
util_hash_table_create_fd_keys(void)
{
return util_hash_table_create(hash_fd, compare_fd);
}
static inline struct cso_hash_iter
util_hash_table_find_iter(struct util_hash_table *ht,
void *key,

View file

@ -66,6 +66,13 @@ struct util_hash_table *
util_hash_table_create_ptr_keys(void);
/**
* Create a hash table where the keys are device FDs.
*/
struct util_hash_table *
util_hash_table_create_fd_keys(void);
enum pipe_error
util_hash_table_set(struct util_hash_table *ht,
void *key,

View file

@ -91,30 +91,6 @@ etna_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
static unsigned hash_fd(void *key)
{
int fd = pointer_to_intptr(key);
struct stat stat;
fstat(fd, &stat);
return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
}
static int compare_fd(void *key1, void *key2)
{
int fd1 = pointer_to_intptr(key1);
int fd2 = pointer_to_intptr(key2);
struct stat stat1, stat2;
fstat(fd1, &stat1);
fstat(fd2, &stat2);
return stat1.st_dev != stat2.st_dev ||
stat1.st_ino != stat2.st_ino ||
stat1.st_rdev != stat2.st_rdev;
}
struct pipe_screen *
etna_drm_screen_create_renderonly(struct renderonly *ro)
{
@ -122,7 +98,7 @@ etna_drm_screen_create_renderonly(struct renderonly *ro)
mtx_lock(&etna_screen_mutex);
if (!etna_tab) {
etna_tab = util_hash_table_create(hash_fd, compare_fd);
etna_tab = util_hash_table_create_fd_keys();
if (!etna_tab)
goto unlock;
}

View file

@ -62,28 +62,6 @@ fd_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
static unsigned hash_fd(void *key)
{
int fd = pointer_to_intptr(key);
struct stat stat;
fstat(fd, &stat);
return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
}
static int compare_fd(void *key1, void *key2)
{
int fd1 = pointer_to_intptr(key1);
int fd2 = pointer_to_intptr(key2);
struct stat stat1, stat2;
fstat(fd1, &stat1);
fstat(fd2, &stat2);
return stat1.st_dev != stat2.st_dev ||
stat1.st_ino != stat2.st_ino ||
stat1.st_rdev != stat2.st_rdev;
}
struct pipe_screen *
fd_drm_screen_create(int fd, struct renderonly *ro)
{
@ -91,7 +69,7 @@ fd_drm_screen_create(int fd, struct renderonly *ro)
mtx_lock(&fd_screen_mutex);
if (!fd_tab) {
fd_tab = util_hash_table_create(hash_fd, compare_fd);
fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab)
goto unlock;
}

View file

@ -57,30 +57,6 @@ lima_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
static unsigned hash_fd(void *key)
{
int fd = pointer_to_intptr(key);
struct stat stat;
fstat(fd, &stat);
return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
}
static int compare_fd(void *key1, void *key2)
{
int fd1 = pointer_to_intptr(key1);
int fd2 = pointer_to_intptr(key2);
struct stat stat1, stat2;
fstat(fd1, &stat1);
fstat(fd2, &stat2);
return stat1.st_dev != stat2.st_dev ||
stat1.st_ino != stat2.st_ino ||
stat1.st_rdev != stat2.st_rdev;
}
struct pipe_screen *
lima_drm_screen_create(int fd)
{
@ -88,7 +64,7 @@ lima_drm_screen_create(int fd)
mtx_lock(&lima_screen_mutex);
if (!fd_tab) {
fd_tab = util_hash_table_create(hash_fd, compare_fd);
fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab)
goto unlock;
}

View file

@ -36,28 +36,6 @@ bool nouveau_drm_screen_unref(struct nouveau_screen *screen)
return ret == 0;
}
static unsigned hash_fd(void *key)
{
int fd = pointer_to_intptr(key);
struct stat stat;
fstat(fd, &stat);
return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
}
static int compare_fd(void *key1, void *key2)
{
int fd1 = pointer_to_intptr(key1);
int fd2 = pointer_to_intptr(key2);
struct stat stat1, stat2;
fstat(fd1, &stat1);
fstat(fd2, &stat2);
return stat1.st_dev != stat2.st_dev ||
stat1.st_ino != stat2.st_ino ||
stat1.st_rdev != stat2.st_rdev;
}
PUBLIC struct pipe_screen *
nouveau_drm_screen_create(int fd)
{
@ -69,7 +47,7 @@ nouveau_drm_screen_create(int fd)
mtx_lock(&nouveau_screen_mutex);
if (!fd_tab) {
fd_tab = util_hash_table_create(hash_fd, compare_fd);
fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab) {
mtx_unlock(&nouveau_screen_mutex);
return NULL;

View file

@ -761,28 +761,6 @@ static bool radeon_read_registers(struct radeon_winsys *rws,
return true;
}
static unsigned hash_fd(void *key)
{
int fd = pointer_to_intptr(key);
struct stat stat;
fstat(fd, &stat);
return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
}
static int compare_fd(void *key1, void *key2)
{
int fd1 = pointer_to_intptr(key1);
int fd2 = pointer_to_intptr(key2);
struct stat stat1, stat2;
fstat(fd1, &stat1);
fstat(fd2, &stat2);
return stat1.st_dev != stat2.st_dev ||
stat1.st_ino != stat2.st_ino ||
stat1.st_rdev != stat2.st_rdev;
}
DEBUG_GET_ONCE_BOOL_OPTION(thread, "RADEON_THREAD", true)
static bool radeon_winsys_unref(struct radeon_winsys *ws)
@ -828,7 +806,7 @@ radeon_drm_winsys_create(int fd, const struct pipe_screen_config *config,
mtx_lock(&fd_tab_mutex);
if (!fd_tab) {
fd_tab = util_hash_table_create(hash_fd, compare_fd);
fd_tab = util_hash_table_create_fd_keys();
}
ws = util_hash_table_get(fd_tab, intptr_to_pointer(fd));

View file

@ -1028,28 +1028,6 @@ virgl_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
static unsigned hash_fd(void *key)
{
int fd = pointer_to_intptr(key);
struct stat stat;
fstat(fd, &stat);
return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
}
static int compare_fd(void *key1, void *key2)
{
int fd1 = pointer_to_intptr(key1);
int fd2 = pointer_to_intptr(key2);
struct stat stat1, stat2;
fstat(fd1, &stat1);
fstat(fd2, &stat2);
return stat1.st_dev != stat2.st_dev ||
stat1.st_ino != stat2.st_ino ||
stat1.st_rdev != stat2.st_rdev;
}
struct pipe_screen *
virgl_drm_screen_create(int fd, const struct pipe_screen_config *config)
{
@ -1057,7 +1035,7 @@ virgl_drm_screen_create(int fd, const struct pipe_screen_config *config)
mtx_lock(&virgl_screen_mutex);
if (!fd_tab) {
fd_tab = util_hash_table_create(hash_fd, compare_fd);
fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab)
goto unlock;
}