gallium/hash_table: consolidate hash tables with FD keys
authorMarek Olšák <marek.olsak@amd.com>
Wed, 5 Feb 2020 19:27:21 +0000 (14:27 -0500)
committerMarge Bot <eric+marge@anholt.net>
Wed, 26 Feb 2020 20:35:50 +0000 (20:35 +0000)
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3722>

src/gallium/auxiliary/util/u_hash_table.c
src/gallium/auxiliary/util/u_hash_table.h
src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c
src/gallium/winsys/lima/drm/lima_drm_winsys.c
src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
src/gallium/winsys/virgl/drm/virgl_drm_winsys.c

index 0a2863dcc0cb53149ce198fa34edae1da9986f62..e58c7823be24c93faef5edbcbe2a570a7e816f27 100644 (file)
 #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,
index cf0c58cd2875125a44258e192b808ef16e9d8111..7db87c4367b6668f4d6487dd997250c15c714c50 100644 (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,
index 8e3f7a06a9a0f357d046cef05381521bd8521e71..bfeeb429be5a3850f97be4f8233b7dc1b25ba17f 100644 (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;
    }
index 719c52a80c7c2c7fdb7cbb97491e1065e1b7aa08..d09208bcb263cf677d8db80af76ef6ad9876058f 100644 (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;
        }
index 07690307c64b24b68e7069a4a1a0fda3eb6e25e0..c9ef94065981a4c2dd0c3d951fcf713658702e87 100644 (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;
    }
index 3e790aa65d52ad18791514ba05df056d15e894ed..57f3702a3e093598d3ec0877f68881c149210de7 100644 (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;
index 0ea43c1959b2e1256cb19e03cdec09ac3b68949b..c38d238bfcdecfae182e17351bbad6ace9102437 100644 (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));
index 53d8fdf3edadecbcd63452c522295c19585d60fd..959af78493bc8565c7b915b1567979077999a533 100644 (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;
    }