Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Unified Diff: native_client_sdk/src/libraries/nacl_io/mount_node_mem.cc

Issue 16232016: [NaCl SDK] nacl_io: big refactor to return error value (errno). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: native_client_sdk/src/libraries/nacl_io/mount_node_mem.cc
diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node_mem.cc b/native_client_sdk/src/libraries/nacl_io/mount_node_mem.cc
index 0fa82baeba30dad2b82c7ab908504d941290f5f7..1e89e4afedbb3767ff0fbd1da6e428bc4fb25997 100644
--- a/native_client_sdk/src/libraries/nacl_io/mount_node_mem.cc
+++ b/native_client_sdk/src/libraries/nacl_io/mount_node_mem.cc
@@ -13,69 +13,83 @@
#define BLOCK_SIZE (1 << 16)
#define BLOCK_MASK (BLOCK_SIZE - 1)
-MountNodeMem::MountNodeMem(Mount *mount)
- : MountNode(mount),
- data_(NULL),
- capacity_(0) {
+MountNodeMem::MountNodeMem(Mount* mount)
+ : MountNode(mount), data_(NULL), capacity_(0) {
stat_.st_mode |= S_IFREG;
}
-MountNodeMem::~MountNodeMem() {
- free(data_);
-}
+MountNodeMem::~MountNodeMem() { free(data_); }
+
+Error MountNodeMem::Read(size_t offs, void* buf, size_t count, int* out_bytes) {
+ *out_bytes = 0;
-int MountNodeMem::Read(size_t offs, void *buf, size_t count) {
AutoLock lock(&lock_);
- if (count == 0) return 0;
- if (offs + count > GetSize()) {
- count = GetSize() - offs;
+ if (count == 0)
+ return 0;
+
+ size_t size = stat_.st_size;
+
+ if (offs + count > size) {
+ count = size - offs;
}
memcpy(buf, &data_[offs], count);
- return static_cast<int>(count);
+ *out_bytes = static_cast<int>(count);
+ return 0;
}
-int MountNodeMem::Write(size_t offs, const void *buf, size_t count) {
+Error MountNodeMem::Write(size_t offs,
+ const void* buf,
+ size_t count,
+ int* out_bytes) {
+ *out_bytes = 0;
+
AutoLock lock(&lock_);
- if (count == 0) return 0;
+ if (count == 0)
+ return 0;
+
+ if (count + offs > stat_.st_size) {
+ Error error = FTruncate(count + offs);
+ if (error)
+ return error;
- if (count + offs > GetSize()) {
- FTruncate(count + offs);
- count = GetSize() - offs;
+ count = stat_.st_size - offs;
}
memcpy(&data_[offs], buf, count);
- return static_cast<int>(count);
+ *out_bytes = static_cast<int>(count);
+ return 0;
}
-int MountNodeMem::FTruncate(off_t size) {
- size_t need = (size + BLOCK_MASK) & ~BLOCK_MASK;
+Error MountNodeMem::FTruncate(off_t new_size) {
+ size_t need = (new_size + BLOCK_MASK) & ~BLOCK_MASK;
+ size_t old_size = stat_.st_size;
noelallen1 2013/06/07 21:48:43 Losing virtual behavior or GetSize, is that what y
binji 2013/06/07 23:23:11 Fair point, though any derived class (none of whic
// If the current capacity is correct, just adjust and return
if (need == capacity_) {
- stat_.st_size = static_cast<off_t>(size);
+ stat_.st_size = static_cast<off_t>(new_size);
return 0;
}
// Attempt to realloc the block
- char *newdata = static_cast<char *>(realloc(data_, need));
+ char* newdata = static_cast<char*>(realloc(data_, need));
if (newdata != NULL) {
// Zero out new space.
- if (size > GetSize())
- memset(newdata + GetSize(), 0, size - GetSize());
+ if (new_size > old_size)
+ memset(newdata + old_size, 0, new_size - old_size);
data_ = newdata;
capacity_ = need;
- stat_.st_size = static_cast<off_t>(size);
+ stat_.st_size = static_cast<off_t>(new_size);
return 0;
}
// If we failed, then adjust size according to what we keep
- if (size > capacity_) size = capacity_;
+ if (new_size > capacity_)
+ new_size = capacity_;
// Update the size and return the new size
- stat_.st_size = static_cast<off_t>(size);
- errno = EIO;
- return -1;
+ stat_.st_size = static_cast<off_t>(new_size);
+ return EIO;
}

Powered by Google App Engine
This is Rietveld 408576698