diff options
author | glider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-13 09:16:49 +0000 |
---|---|---|
committer | glider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-13 09:16:49 +0000 |
commit | df0211a7dd85ada61c4bfa60228e100d6535e37b (patch) | |
tree | aa6eee29bbedf5e6424a93c3c4a2ff34a9aa6919 /webkit/fileapi | |
parent | 58584d39d22e22d7e102523e7fc19aa5602ab097 (diff) | |
download | chromium_src-df0211a7dd85ada61c4bfa60228e100d6535e37b.zip chromium_src-df0211a7dd85ada61c4bfa60228e100d6535e37b.tar.gz chromium_src-df0211a7dd85ada61c4bfa60228e100d6535e37b.tar.bz2 |
Revert 132134 - Use LocalFileReader in FileSystemURLRequestJob
Reason: multiple leak reports on the Memory FYI waterfall (Valgrind, Heapcheck).
- to avoid file access on IO thread
- to remove duplicated code
- for further FileSystem stream related refactoring
BUG=113300,114999,123302
TEST=FileSystemURLRequestJobTest.*
Review URL: https://chromiumcodereview.appspot.com/10065011
TBR=kinuko@chromium.org
Review URL: https://chromiumcodereview.appspot.com/10066043
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132162 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi')
-rw-r--r-- | webkit/fileapi/file_system_url_request_job.cc | 80 | ||||
-rw-r--r-- | webkit/fileapi/file_system_url_request_job.h | 7 |
2 files changed, 69 insertions, 18 deletions
diff --git a/webkit/fileapi/file_system_url_request_job.cc b/webkit/fileapi/file_system_url_request_job.cc index 3a9af90..1815117 100644 --- a/webkit/fileapi/file_system_url_request_job.cc +++ b/webkit/fileapi/file_system_url_request_job.cc @@ -4,6 +4,8 @@ #include "webkit/fileapi/file_system_url_request_job.h" +#include <vector> + #include "base/bind.h" #include "base/compiler_specific.h" #include "base/file_path.h" @@ -11,7 +13,6 @@ #include "base/message_loop.h" #include "base/platform_file.h" #include "base/threading/thread_restrictions.h" -#include "base/time.h" #include "build/build_config.h" #include "googleurl/src/gurl.h" #include "net/base/file_stream.h" @@ -23,7 +24,6 @@ #include "net/http/http_response_info.h" #include "net/http/http_util.h" #include "net/url_request/url_request.h" -#include "webkit/blob/local_file_reader.h" #include "webkit/blob/shareable_file_reference.h" #include "webkit/fileapi/file_system_context.h" #include "webkit/fileapi/file_system_operation.h" @@ -32,10 +32,13 @@ using net::URLRequest; using net::URLRequestJob; using net::URLRequestStatus; -using webkit_blob::LocalFileReader; namespace fileapi { +static const int kFileFlags = base::PLATFORM_FILE_OPEN | + base::PLATFORM_FILE_READ | + base::PLATFORM_FILE_ASYNC; + static net::HttpResponseHeaders* CreateHttpResponseHeaders() { // HttpResponseHeaders expects its input string to be terminated by two NULs. static const char kStatus[] = "HTTP/1.1 200 OK\0"; @@ -59,11 +62,20 @@ FileSystemURLRequestJob::FileSystemURLRequestJob( file_system_context_(file_system_context), file_thread_proxy_(file_thread_proxy), ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), + stream_(NULL), is_directory_(false), remaining_bytes_(0) { } -FileSystemURLRequestJob::~FileSystemURLRequestJob() {} +FileSystemURLRequestJob::~FileSystemURLRequestJob() { + // Since we use the two-arg constructor of FileStream, we need to call Close() + // manually: ~FileStream won't call it for us. + if (stream_ != NULL) { + // Close() performs file IO: crbug.com/113300. + base::ThreadRestrictions::ScopedAllowIO allow_io; + stream_->CloseSync(); + } +} void FileSystemURLRequestJob::Start() { MessageLoop::current()->PostTask( @@ -73,8 +85,12 @@ void FileSystemURLRequestJob::Start() { } void FileSystemURLRequestJob::Kill() { - if (reader_.get() != NULL) - reader_.reset(); + if (stream_ != NULL) { + // Close() performs file IO: crbug.com/113300. + base::ThreadRestrictions::ScopedAllowIO allow_io; + stream_->CloseSync(); + stream_.reset(NULL); + } URLRequestJob::Kill(); weak_factory_.InvalidateWeakPtrs(); } @@ -85,7 +101,7 @@ bool FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size, DCHECK(bytes_read); DCHECK_GE(remaining_bytes_, 0); - if (reader_.get() == NULL) + if (stream_ == NULL) return false; if (remaining_bytes_ < dest_size) @@ -96,9 +112,18 @@ bool FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size, return true; } - const int rv = reader_->Read(dest, dest_size, - base::Bind(&FileSystemURLRequestJob::DidRead, - base::Unretained(this))); + int rv = stream_->Read(dest, dest_size, + base::Bind(&FileSystemURLRequestJob::DidRead, + base::Unretained(this))); + if (rv >= 0) { + // Data is immediately available. + *bytes_read = rv; + remaining_bytes_ -= rv; + DCHECK_GE(remaining_bytes_, 0); + return true; + } + + // Otherwise, a read error occured. We may just need to wait... if (rv == net::ERR_IO_PENDING) SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); else @@ -189,24 +214,47 @@ void FileSystemURLRequestJob::DidCreateSnapshot( return; } - if (is_directory_) { + if (!is_directory_) { + base::FileUtilProxy::CreateOrOpen( + file_thread_proxy_, platform_path, kFileFlags, + base::Bind(&FileSystemURLRequestJob::DidOpen, + weak_factory_.GetWeakPtr())); + } else { NotifyHeadersComplete(); + } +} + +void FileSystemURLRequestJob::DidOpen(base::PlatformFileError error_code, + base::PassPlatformFile file, + bool created) { + if (error_code != base::PLATFORM_FILE_OK) { + NotifyFailed(error_code); return; } + stream_.reset(new net::FileStream(file.ReleaseValue(), kFileFlags, NULL)); + remaining_bytes_ = byte_range_.last_byte_position() - byte_range_.first_byte_position() + 1; DCHECK_GE(remaining_bytes_, 0); - DCHECK(!reader_.get()); - reader_.reset(new LocalFileReader( - file_thread_proxy_, platform_path, - byte_range_.first_byte_position(), - base::Time())); + // TODO(adamk): Please remove this ScopedAllowIO once we support async seek + // on FileStream. crbug.com/113300 + base::ThreadRestrictions::ScopedAllowIO allow_io; + // Do the seek at the beginning of the request. + if (remaining_bytes_ > 0 && + byte_range_.first_byte_position() != 0 && + byte_range_.first_byte_position() != + stream_->SeekSync(net::FROM_BEGIN, + byte_range_.first_byte_position())) { + NotifyFailed(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE); + return; + } set_expected_content_size(remaining_bytes_); response_info_.reset(new net::HttpResponseInfo()); response_info_->headers = CreateHttpResponseHeaders(); + NotifyHeadersComplete(); } diff --git a/webkit/fileapi/file_system_url_request_job.h b/webkit/fileapi/file_system_url_request_job.h index f0f9a18..4f968e3 100644 --- a/webkit/fileapi/file_system_url_request_job.h +++ b/webkit/fileapi/file_system_url_request_job.h @@ -19,8 +19,11 @@ class GURL; class FilePath; +namespace net { +class FileStream; +} + namespace webkit_blob { -class LocalFileReader; class ShareableFileReference; } @@ -70,7 +73,7 @@ class FileSystemURLRequestJob : public net::URLRequestJob { FileSystemContext* file_system_context_; scoped_refptr<base::MessageLoopProxy> file_thread_proxy_; base::WeakPtrFactory<FileSystemURLRequestJob> weak_factory_; - scoped_ptr<webkit_blob::LocalFileReader> reader_; + scoped_ptr<net::FileStream> stream_; scoped_refptr<webkit_blob::ShareableFileReference> snapshot_ref_; bool is_directory_; scoped_ptr<net::HttpResponseInfo> response_info_; |