Pull pwrite functionality into Converse
authorPhil Miller <mille121@illinois.edu>
Fri, 9 Aug 2013 00:37:30 +0000 (19:37 -0500)
committerPhil Miller <mille121@illinois.edu>
Tue, 20 Aug 2013 23:29:12 +0000 (18:29 -0500)
src/conv-core/converse.h
src/libs/ck-libs/io/ckio.C
src/util/pup_util.C

index 87770913c9fb1e5d776491d7b6a374327f35a2f0..b332b4260c2256227bf84140bf6d5c82453d0690 100644 (file)
@@ -2000,6 +2000,7 @@ CpvExtern(int,charmLibExitFlag);
 /******** I/O wrappers ***********/
 
 size_t CmiFwrite(const void *ptr, size_t size, size_t nmemb, FILE *f);
+CmiInt8 CmiPwrite(int fd, char *buf, size_t bytes, size_t offset);
 FILE *CmiFopen(const char *path, const char *mode);
 int CmiFclose(FILE *fp);
 
index cb6c515ab939a38ef5536db0dc8779c922ad7524..2888edf168589b284b1f725d10ec50253bde463d 100644 (file)
@@ -12,32 +12,6 @@ typedef int FileToken;
 #include <errno.h>
 #include <pup_stl.h>
 
-#if defined(_WIN32)
-#include <io.h>
-
-int pwrite(int fd, const void *buf, size_t nbytes, off_t offset)
-{
-  long ret = _lseek(fd, offset, SEEK_SET);
-
-  if (ret == -1) {
-    return(-1);
-  }
-  return(_write(fd, buf, nbytes));
-}
-#define NO_UNISTD_NEEDED
-#endif
-
-#if defined(__PGIC__)
-// PGI compilers define funny feature flags that lead to standard
-// headers omitting this prototype
-ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
-#define NO_UNISTD_NEEDED
-#endif
-
-#if !defined(NO_UNISTD_NEEDED)
-#include <unistd.h>
-#endif
-
 using std::min;
 using std::max;
 using std::map;
@@ -335,20 +309,12 @@ namespace Ck { namespace IO {
           int l = buf.bytes_filled_so_far;
           char *d = &(buf.array[0]);
 
-          while (l > 0) {
-            CmiInt8 ret = pwrite(file->fd, d, l, bufferOffset);
-            if (ret < 0) {
-              if (errno == EINTR) {
-                continue;
-              } else {
-                fatalError("Call to pwrite failed", file->name);
-              }
-            }
-            l -= ret;
-            d += ret;
-            bufferOffset += ret;
-          }
-          myBytesWritten += buf.bytes_filled_so_far;
+          CmiInt8 ret = CmiPwrite(file->fd, d, l, bufferOffset);
+          if (ret < 0)
+            fatalError("Call to pwrite failed", file->name);
+
+          CkAssert(ret == l);
+          myBytesWritten += l;
         }
       };
 
index c659d0e64fbce93670a3c44bce8da6fb64e71b9a..508e8c4d86a139efddcabe58f34eade9fde9ed77 100644 (file)
@@ -22,6 +22,32 @@ virtual functions are defined here.
 #include "pup.h"
 #include "ckhashtable.h"
 
+#if defined(_WIN32)
+#include <io.h>
+
+int pwrite(int fd, const void *buf, size_t nbytes, off_t offset)
+{
+  long ret = _lseek(fd, offset, SEEK_SET);
+
+  if (ret == -1) {
+    return(-1);
+  }
+  return(_write(fd, buf, nbytes));
+}
+#define NO_UNISTD_NEEDED
+#endif
+
+#if defined(__PGIC__)
+// PGI compilers define funny feature flags that lead to standard
+// headers omitting this prototype
+ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
+#define NO_UNISTD_NEEDED
+#endif
+
+#if !defined(NO_UNISTD_NEEDED)
+#include <unistd.h>
+#endif
+
 PUP::er::~er() {}
 
 void PUP::er::operator()(able& a)
@@ -158,6 +184,25 @@ size_t CmiFwrite(const void *ptr, size_t size, size_t nmemb, FILE *f)
         return nwritten;
 }
 
+CmiInt8 CmiPwrite(int fd, char *buf, size_t bytes, size_t offset)
+{
+  size_t origBytes = bytes;
+  while (bytes > 0) {
+    CmiInt8 ret = pwrite(fd, buf, bytes, offset);
+    if (ret < 0) {
+      if (errno == EINTR) {
+        continue;
+      } else {
+        return ret;
+      }
+    }
+    bytes -= ret;
+    buf += ret;
+    offset += ret;
+  }
+  return origBytes;
+}
+
 size_t CmiFread(void *ptr, size_t size, size_t nmemb, FILE *f)
 {
         size_t nread = 0;