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

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

Issue 13951014: [NaCl SDK] nacl_io: opening a node immediately after mounting would fail. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix windows Created 7 years, 8 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_html5fs.cc
diff --git a/native_client_sdk/src/libraries/nacl_io/mount_html5fs.cc b/native_client_sdk/src/libraries/nacl_io/mount_html5fs.cc
index abe62e6f4af7bb4836421784c93ca1f962300cfb..0588bf5f165dcceff3b93ff2010796155f0867f5 100644
--- a/native_client_sdk/src/libraries/nacl_io/mount_html5fs.cc
+++ b/native_client_sdk/src/libraries/nacl_io/mount_html5fs.cc
@@ -25,7 +25,7 @@ int64_t strtoull(const char* nptr, char** endptr, int base) {
} // namespace
MountNode *MountHtml5Fs::Open(const Path& path, int mode) {
- if (!IsFilesystemOpen())
+ if (BlockUntilFilesystemOpen() != PP_OK)
return NULL;
PP_Resource fileref = ppapi()->GetFileRefInterface()->Create(
@@ -47,8 +47,8 @@ int MountHtml5Fs::Unlink(const Path& path) {
}
int MountHtml5Fs::Mkdir(const Path& path, int permissions) {
- if (!IsFilesystemOpen()) {
- errno = EINVAL;
+ if (BlockUntilFilesystemOpen() != PP_OK) {
+ errno = ENODEV;
return -1;
}
@@ -75,8 +75,8 @@ int MountHtml5Fs::Rmdir(const Path& path) {
}
int MountHtml5Fs::Remove(const Path& path) {
- if (!IsFilesystemOpen()) {
- errno = EINVAL;
+ if (BlockUntilFilesystemOpen() != PP_OK) {
+ errno = ENODEV;
return -1;
}
@@ -102,7 +102,8 @@ int MountHtml5Fs::Remove(const Path& path) {
MountHtml5Fs::MountHtml5Fs()
: filesystem_resource_(0),
- filesystem_open_(false) {
+ filesystem_open_has_result_(false),
+ filesystem_open_result_(PP_OK) {
}
bool MountHtml5Fs::Init(int dev, StringMap_t& args, PepperInterface* ppapi) {
@@ -135,22 +136,40 @@ bool MountHtml5Fs::Init(int dev, StringMap_t& args, PepperInterface* ppapi) {
if (filesystem_resource_ == 0)
return false;
- // Open the filesystem. Don't block, this could be called from the main
- // thread.
- ppapi->GetFileSystemInterface()->Open(filesystem_resource_, expected_size,
+ // We can't block the main thread, so make an asynchronous call if on main
+ // thread. If we are off-main-thread, then don't make an asynchronous call;
+ // otherwise we require a message loop.
+ bool main_thread = ppapi->IsMainThread();
+ PP_CompletionCallback cc = main_thread ?
PP_MakeCompletionCallback(&MountHtml5Fs::FilesystemOpenCallbackThunk,
- this));
+ this) :
+ PP_BlockUntilComplete();
+
+ int32_t result = ppapi->GetFileSystemInterface()->Open(
+ filesystem_resource_, expected_size, cc);
- return true;
+ if (!main_thread) {
+ filesystem_open_has_result_ = true;
+ filesystem_open_result_ = result;
+
+ return filesystem_open_result_ == PP_OK;
+ } else {
+ // We have to assume the call to Open will succeed; there is no better
+ // result to return here.
+ return true;
+ }
}
void MountHtml5Fs::Destroy() {
ppapi_->ReleaseResource(filesystem_resource_);
}
-bool MountHtml5Fs::IsFilesystemOpen() {
+int32_t MountHtml5Fs::BlockUntilFilesystemOpen() {
AutoLock lock(&lock_);
- return filesystem_open_;
+ while (!filesystem_open_has_result_) {
+ pthread_cond_wait(&filesystem_open_cond_, &lock_);
+ }
+ return filesystem_open_result_;
}
// static
@@ -162,5 +181,7 @@ void MountHtml5Fs::FilesystemOpenCallbackThunk(void* user_data,
void MountHtml5Fs::FilesystemOpenCallback(int32_t result) {
AutoLock lock(&lock_);
- filesystem_open_ = result == PP_OK;
+ filesystem_open_has_result_ = true;
+ filesystem_open_result_ = result;
+ pthread_cond_signal(&filesystem_open_cond_);
}
« no previous file with comments | « native_client_sdk/src/libraries/nacl_io/mount_html5fs.h ('k') | native_client_sdk/src/libraries/nacl_io/pepper_interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698