Forráskód Böngészése

Use pread and pwrite when available

Samuel Thibault 10 éve
szülő
commit
c71d4b92b2
2 módosított fájl, 19 hozzáadás és 5 törlés
  1. 2 0
      configure.ac
  2. 17 5
      src/core/disk_ops/unistd/disk_unistd_global.c

+ 2 - 0
configure.ac

@@ -296,6 +296,8 @@ AC_CHECK_HEADERS([aio.h])
 
 AC_CHECK_FUNCS([mkstemps])
 
+AC_CHECK_FUNCS([pread pwrite])
+
 # This defines HAVE_SYNC_VAL_COMPARE_AND_SWAP
 STARPU_CHECK_SYNC_VAL_COMPARE_AND_SWAP
 

+ 17 - 5
src/core/disk_ops/unistd/disk_unistd_global.c

@@ -172,16 +172,22 @@ starpu_unistd_global_close (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, size_
 starpu_unistd_global_read (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size)
 {
 	struct starpu_unistd_global_obj * tmp = (struct starpu_unistd_global_obj *) obj;
+	int res;
 
+#ifdef HAVE_PREAD
+	ssize_t nb = pread(tmp->descriptor, buf, size, offset);
+#else
 	STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex);
 
-	int res = lseek(tmp->descriptor, offset, SEEK_SET); 
+	res = lseek(tmp->descriptor, offset, SEEK_SET); 
 	STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd lseek for read failed: offset %lu got errno %d", (unsigned long) offset, errno);
 
 	ssize_t nb = read(tmp->descriptor, buf, size);
-	STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd read failed: size %lu got errno %d", (unsigned long) size, errno);
 	
 	STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex);
+#endif
+
+	STARPU_ASSERT_MSG(nb >= 0, "Starpu Disk unistd read failed: size %lu got errno %d", (unsigned long) size, errno);
 
 	return nb;
 }
@@ -237,16 +243,22 @@ starpu_unistd_global_full_read(void *base STARPU_ATTRIBUTE_UNUSED, void * obj, v
 starpu_unistd_global_write (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, const void *buf, off_t offset, size_t size)
 {
 	struct starpu_unistd_global_obj * tmp = (struct starpu_unistd_global_obj *) obj;
+	int res;
 
+#ifdef HAVE_PWRITE
+	res = pwrite (tmp->descriptor, buf, size, offset);
+#else
 	STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex);
 	
-	int res = lseek(tmp->descriptor, offset, SEEK_SET); 
+	res = lseek(tmp->descriptor, offset, SEEK_SET); 
 	STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd lseek for write failed: offset %lu got errno %d", (unsigned long) offset, errno);
 
-	write (tmp->descriptor, buf, size);
-	STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd write failed: size %lu got errno %d", (unsigned long) size, errno);
+	res = write (tmp->descriptor, buf, size);
 
 	STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex);
+#endif
+
+	STARPU_ASSERT_MSG(res >= 0, "Starpu Disk unistd write failed: size %lu got errno %d", (unsigned long) size, errno);
 
 	return 0;
 }