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

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

Issue 18129008: Clean up locking. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge with master Created 7 years, 5 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/kernel_proxy.cc
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
index 8d5655ab59945c927ea65be2633d1b825051bcaf..385bfa8b3503019d1dec7a7dd4701ecd1d8a9d53 100644
--- a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
@@ -37,7 +37,8 @@
#define USR_ID 1002
#define GRP_ID 1003
-KernelProxy::KernelProxy() : dev_(0), ppapi_(NULL) {}
+KernelProxy::KernelProxy() : dev_(0), ppapi_(NULL) {
+}
KernelProxy::~KernelProxy() {
// Clean up the MountFactories.
@@ -52,7 +53,6 @@ KernelProxy::~KernelProxy() {
void KernelProxy::Init(PepperInterface* ppapi) {
ppapi_ = ppapi;
- cwd_ = "/";
dev_ = 1;
factories_["memfs"] = new TypedMountFactory<MountMem>;
@@ -75,17 +75,10 @@ void KernelProxy::Init(PepperInterface* ppapi) {
}
binji 2013/07/10 21:24:34 move open_resource up here to match header order?
noelallen1 2013/07/10 22:11:07 Done.
int KernelProxy::open(const char* path, int oflags) {
- Path rel;
-
ScopedMount mnt;
- Error error = AcquireMountAndPath(path, &mnt, &rel);
- if (error) {
- errno = error;
- return -1;
- }
-
ScopedMountNode node;
- error = mnt->Open(rel, oflags, &node);
+
+ Error error = AcquireMountAndNode(path, oflags, &mnt, &node);
if (error) {
errno = error;
return -1;
@@ -141,19 +134,30 @@ int KernelProxy::dup2(int oldfd, int newfd) {
return newfd;
}
+int KernelProxy::chdir(const char* path) {
+ Error error = SetCWD(path);
+ if (error) {
+ errno = error;
+ return -1;
+ }
+ return 0;
+}
+
char* KernelProxy::getcwd(char* buf, size_t size) {
- AutoLock lock(&process_lock_);
+ std::string cwd = GetCWD();
+
if (size <= 0) {
errno = EINVAL;
return NULL;
}
+
// If size is 0, allocate as much as we need.
if (size == 0) {
- size = cwd_.size() + 1;
+ size = cwd.size() + 1;
}
// Verify the buffer is large enough
- if (size <= cwd_.size()) {
+ if (size <= cwd.size()) {
errno = ERANGE;
return NULL;
}
@@ -163,7 +167,7 @@ char* KernelProxy::getcwd(char* buf, size_t size) {
buf = static_cast<char*>(malloc(size));
}
- strcpy(buf, cwd_.c_str());
+ strcpy(buf, cwd.c_str());
return buf;
}
@@ -197,14 +201,15 @@ int KernelProxy::lchown(const char* path, uid_t owner, gid_t group) {
return 0;
}
-int KernelProxy::utime(const char* filename, const struct utimbuf* times) {
+int KernelProxy::utime(const char* path, const struct utimbuf* times) {
binji 2013/07/10 21:24:34 "filename" matches the linux man page... but if yo
noelallen1 2013/07/10 22:11:07 Done.
return 0;
}
int KernelProxy::mkdir(const char* path, mode_t mode) {
ScopedMount mnt;
Path rel;
- Error error = AcquireMountAndPath(path, &mnt, &rel);
+
+ Error error = AcquireMountAndRelPath(path, &mnt, &rel);
if (error) {
errno = error;
return -1;
@@ -222,7 +227,8 @@ int KernelProxy::mkdir(const char* path, mode_t mode) {
int KernelProxy::rmdir(const char* path) {
ScopedMount mnt;
Path rel;
- Error error = AcquireMountAndPath(path, &mnt, &rel);
+
+ Error error = AcquireMountAndRelPath(path, &mnt, &rel);
if (error) {
errno = error;
return -1;
@@ -247,42 +253,12 @@ int KernelProxy::stat(const char* path, struct stat* buf) {
return result;
}
-int KernelProxy::chdir(const char* path) {
- struct stat statbuf;
- if (stat(path, &statbuf) == -1)
- return -1;
-
- bool is_dir = (statbuf.st_mode & S_IFDIR) != 0;
- if (!is_dir) {
- errno = ENOTDIR;
- return -1;
- }
-
- AutoLock lock(&process_lock_);
- cwd_ = GetAbsPathLocked(path).Join();
- return 0;
-}
int KernelProxy::mount(const char* source,
const char* target,
const char* filesystemtype,
unsigned long mountflags,
const void* data) {
- // See if it's already mounted
- std::string abs_targ;
-
- // Scope this lock to prevent holding both process and kernel locks
- {
- AutoLock lock(&process_lock_);
- abs_targ = GetAbsPathLocked(target).Join();
- }
-
- AutoLock lock(&kernel_lock_);
- if (mounts_.find(abs_targ) != mounts_.end()) {
- errno = EBUSY;
- return -1;
- }
-
// Find a factory of that type
MountFactoryMap_t::iterator factory = factories_.find(filesystemtype);
if (factory == factories_.end()) {
@@ -290,9 +266,10 @@ int KernelProxy::mount(const char* source,
return -1;
}
+ // Create a map of settings
StringMap_t smap;
smap["SOURCE"] = source;
- smap["TARGET"] = abs_targ;
+ smap["TARGET"] = target;
binji 2013/07/10 21:24:34 need to make this absolute, right?
noelallen1 2013/07/10 22:11:07 Done.
if (data) {
char* str = strdup(static_cast<const char*>(data));
@@ -311,8 +288,16 @@ int KernelProxy::mount(const char* source,
free(str);
}
+ ScopedMount mnt;
Error error =
binji 2013/07/10 21:24:34 fits on one line now
noelallen1 2013/07/10 22:11:07 Done.
- factory->second->CreateMount(dev_++, smap, ppapi_, &mounts_[abs_targ]);
+ factory->second->CreateMount(dev_++, smap, ppapi_, &mnt);
+
+ if (error) {
+ errno = error;
+ return -1;
+ }
+
+ error = MountAtPath(mnt, target);
if (error) {
errno = error;
return -1;
@@ -322,28 +307,11 @@ int KernelProxy::mount(const char* source,
}
int KernelProxy::umount(const char* path) {
- Path abs_path;
-
- // Scope this lock to prevent holding both process and kernel locks
- {
- AutoLock lock(&process_lock_);
- abs_path = GetAbsPathLocked(path);
- }
-
- AutoLock lock(&kernel_lock_);
- MountMap_t::iterator it = mounts_.find(abs_path.Join());
-
- if (mounts_.end() == it) {
- errno = EINVAL;
- return -1;
- }
-
- if (it->second->RefCount() != 1) {
- errno = EBUSY;
+ Error error = UnmountPath(path);
+ if (error) {
+ errno = error;
return -1;
}
-
- mounts_.erase(it);
return 0;
}
@@ -519,7 +487,8 @@ off_t KernelProxy::lseek(int fd, off_t offset, int whence) {
int KernelProxy::unlink(const char* path) {
ScopedMount mnt;
Path rel;
- Error error = AcquireMountAndPath(path, &mnt, &rel);
+
+ Error error = AcquireMountAndRelPath(path, &mnt, &rel);
if (error) {
errno = error;
return -1;
@@ -537,7 +506,8 @@ int KernelProxy::unlink(const char* path) {
int KernelProxy::remove(const char* path) {
ScopedMount mnt;
Path rel;
- Error error = AcquireMountAndPath(path, &mnt, &rel);
+
+ Error error = AcquireMountAndRelPath(path, &mnt, &rel);
if (error) {
errno = error;
return -1;
@@ -565,10 +535,10 @@ int KernelProxy::fchmod(int fd, int mode) {
}
int KernelProxy::access(const char* path, int amode) {
+ ScopedMount mnt;
Path rel;
- ScopedMount mnt;
- Error error = AcquireMountAndPath(path, &mnt, &rel);
+ Error error = AcquireMountAndRelPath(path, &mnt, &rel);
if (error) {
errno = error;
return -1;
@@ -659,7 +629,8 @@ int KernelProxy::munmap(void* addr, size_t length) {
int KernelProxy::open_resource(const char* path) {
ScopedMount mnt;
Path rel;
- Error error = AcquireMountAndPath(path, &mnt, &rel);
+
+ Error error = AcquireMountAndRelPath(path, &mnt, &rel);
if (error) {
errno = error;
return -1;

Powered by Google App Engine
This is Rietveld 408576698