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

Unified Diff: ppapi/proxy/file_io_resource.cc

Issue 121973003: Merge 242646 "Pepper: FileIO holds FileSystem ref with scoped_re..." (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1750/src/
Patch Set: Created 6 years, 11 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
« no previous file with comments | « ppapi/proxy/file_io_resource.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/proxy/file_io_resource.cc
===================================================================
--- ppapi/proxy/file_io_resource.cc (revision 243312)
+++ ppapi/proxy/file_io_resource.cc (working copy)
@@ -18,10 +18,12 @@
#include "ppapi/shared_impl/resource_tracker.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppb_file_ref_api.h"
+#include "ppapi/thunk/ppb_file_system_api.h"
using ppapi::thunk::EnterResourceNoLock;
using ppapi::thunk::PPB_FileIO_API;
using ppapi::thunk::PPB_FileRef_API;
+using ppapi::thunk::PPB_FileSystem_API;
namespace {
@@ -80,11 +82,13 @@
FileIOResource::FileIOResource(Connection connection, PP_Instance instance)
: PluginResource(connection, instance),
- file_system_type_(PP_FILESYSTEMTYPE_INVALID) {
+ file_system_type_(PP_FILESYSTEMTYPE_INVALID),
+ called_close_(false) {
SendCreate(BROWSER, PpapiHostMsg_FileIO_Create());
}
FileIOResource::~FileIOResource() {
+ Close();
}
PPB_FileIO_API* FileIOResource::AsPPB_FileIO_API() {
@@ -94,30 +98,36 @@
int32_t FileIOResource::Open(PP_Resource file_ref,
int32_t open_flags,
scoped_refptr<TrackedCallback> callback) {
- EnterResourceNoLock<PPB_FileRef_API> enter(file_ref, true);
- if (enter.failed())
+ EnterResourceNoLock<PPB_FileRef_API> enter_file_ref(file_ref, true);
+ if (enter_file_ref.failed())
return PP_ERROR_BADRESOURCE;
- PPB_FileRef_API* file_ref_api = enter.object();
+ PPB_FileRef_API* file_ref_api = enter_file_ref.object();
const FileRefCreateInfo& create_info = file_ref_api->GetCreateInfo();
if (!FileSystemTypeIsValid(create_info.file_system_type)) {
NOTREACHED();
return PP_ERROR_FAILED;
}
-
int32_t rv = state_manager_.CheckOperationState(
FileIOStateManager::OPERATION_EXCLUSIVE, false);
if (rv != PP_OK)
return rv;
file_system_type_ = create_info.file_system_type;
- // Keep the FileSystem host alive by taking a reference to its resource. The
- // FileIO host uses the FileSystem host for running tasks.
- file_system_resource_ = create_info.file_system_plugin_resource;
+ if (create_info.file_system_plugin_resource) {
+ EnterResourceNoLock<PPB_FileSystem_API> enter_file_system(
+ create_info.file_system_plugin_resource, true);
+ if (enter_file_system.failed())
+ return PP_ERROR_FAILED;
+ // Take a reference on the FileSystem resource. The FileIO host uses the
+ // FileSystem host for running tasks and checking quota.
+ file_system_resource_ = enter_file_system.resource();
+ }
+
// Take a reference on the FileRef resource while we're opening the file; we
// don't want the plugin destroying it during the Open operation.
- file_ref_ = enter.resource();
+ file_ref_ = enter_file_ref.resource();
Call<PpapiPluginMsg_FileIO_OpenReply>(BROWSER,
PpapiHostMsg_FileIO_Open(
@@ -279,9 +289,13 @@
}
void FileIOResource::Close() {
- if (file_handle_) {
+ if (called_close_)
+ return;
+
+ called_close_ = true;
+ if (file_handle_)
file_handle_ = NULL;
- }
+
Post(BROWSER, PpapiHostMsg_FileIO_Close());
}
« no previous file with comments | « ppapi/proxy/file_io_resource.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698