v3d/tex: only look up the 2nd texture gather offset for 1d non-arrays
[mesa.git] / src / util / os_file.c
index ae41506332d3863e77b64669b619aa551b386d3e..5771b27e5d0730d33a0a3a95235c2432320eb9a8 100644 (file)
@@ -35,8 +35,11 @@ os_file_create_unique(const char *filename, int filemode)
 
 #include <fcntl.h>
 #include <sys/stat.h>
+#include <sys/syscall.h>
 #include <unistd.h>
 
+/* copied from <linux/kcmp.h> */
+#define KCMP_FILE 0
 
 static ssize_t
 readN(int fd, char *buf, size_t len)
@@ -64,7 +67,7 @@ readN(int fd, char *buf, size_t len)
 }
 
 char *
-os_read_file(const char *filename)
+os_read_file(const char *filename, size_t *size)
 {
    /* Note that this also serves as a slight margin to avoid a 2x grow when
     * the file is just a few bytes larger when we read it than when we
@@ -120,7 +123,6 @@ os_read_file(const char *filename)
    char *newbuf = realloc(buf, len);
    if (!newbuf) {
       free(buf);
-      close(fd);
       errno = -ENOMEM;
       return NULL;
    }
@@ -128,16 +130,44 @@ os_read_file(const char *filename)
 
    buf[offset] = '\0';
 
+   if (size)
+      *size = offset;
+
    return buf;
 }
 
+int
+os_same_file_description(int fd1, int fd2)
+{
+   pid_t pid = getpid();
+
+   /* Same file descriptor trivially implies same file description */
+   if (fd1 == fd2)
+      return 0;
+
+   return syscall(SYS_kcmp, pid, pid, KCMP_FILE, fd1, fd2);
+}
+
 #else
 
+#include "u_debug.h"
+
 char *
-os_read_file(const char *filename)
+os_read_file(const char *filename, size_t *size)
 {
    errno = -ENOSYS;
    return NULL;
 }
 
+int
+os_same_file_description(int fd1, int fd2)
+{
+   /* Same file descriptor trivially implies same file description */
+   if (fd1 == fd2)
+      return 0;
+
+   /* Otherwise we can't tell */
+   return -1;
+}
+
 #endif