diff options
author | satorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-03 04:40:21 +0000 |
---|---|---|
committer | satorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-03 04:40:21 +0000 |
commit | 1d04d7299fa371256bfa07dc4c9efd1553b0792f (patch) | |
tree | fc15bd500994632604de8daeb27f17d92b891ad9 | |
parent | 7fff3291749da0ed6cc82188b42019b3d3be91cf (diff) | |
download | chromium_src-1d04d7299fa371256bfa07dc4c9efd1553b0792f.zip chromium_src-1d04d7299fa371256bfa07dc4c9efd1553b0792f.tar.gz chromium_src-1d04d7299fa371256bfa07dc4c9efd1553b0792f.tar.bz2 |
net: Use ClosePlatformFile() instead of close/CloseHandle().
ClosePlatformFile() is guarded with ThreadRestrictions::AssertIOAllowed()
that will catch bad pieces of code performing file IO on wrong threads.
The original patch was reverted as it broke tests in debug builds.
This version contains workarounds for the bad pieces of code.
BUG=59849,72001,75548,112474,112512
TEST=try bots both release and debug
Review URL: http://codereview.chromium.org/9315062
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@120283 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/sessions/session_backend.cc | 6 | ||||
-rw-r--r-- | content/browser/renderer_host/redirect_to_file_resource_handler.cc | 2 | ||||
-rw-r--r-- | net/base/file_stream_posix.cc | 3 | ||||
-rw-r--r-- | net/base/file_stream_win.cc | 3 | ||||
-rw-r--r-- | net/url_request/url_request_file_job.cc | 3 | ||||
-rw-r--r-- | webkit/blob/blob_url_request_job.cc | 2 |
6 files changed, 16 insertions, 3 deletions
diff --git a/chrome/browser/sessions/session_backend.cc b/chrome/browser/sessions/session_backend.cc index f9d2b8c..ba9f9ad 100644 --- a/chrome/browser/sessions/session_backend.cc +++ b/chrome/browser/sessions/session_backend.cc @@ -9,6 +9,7 @@ #include "base/file_util.h" #include "base/memory/scoped_vector.h" #include "base/metrics/histogram.h" +#include "base/threading/thread_restrictions.h" #include "net/base/file_stream.h" #include "net/base/net_errors.h" @@ -343,6 +344,11 @@ bool SessionBackend::AppendCommandsToFile(net::FileStream* file, } SessionBackend::~SessionBackend() { + if (current_session_file_.get()) { + // Close() performs file IO. crbug.com/112512. + base::ThreadRestrictions::ScopedAllowIO allow_io; + current_session_file_->Close(); + } } void SessionBackend::ResetFile() { diff --git a/content/browser/renderer_host/redirect_to_file_resource_handler.cc b/content/browser/renderer_host/redirect_to_file_resource_handler.cc index e4147f0..64e007b 100644 --- a/content/browser/renderer_host/redirect_to_file_resource_handler.cc +++ b/content/browser/renderer_host/redirect_to_file_resource_handler.cc @@ -139,6 +139,8 @@ void RedirectToFileResourceHandler::OnRequestClosed() { if (file_stream_.get()) { // We require this explicit call to Close since file_stream_ was constructed // directly from a PlatformFile. + // Close() performs file IO. crbug.com/112474. + base::ThreadRestrictions::ScopedAllowIO allow_io; file_stream_->Close(); file_stream_.reset(); } diff --git a/net/base/file_stream_posix.cc b/net/base/file_stream_posix.cc index 502d0f1..a094eed 100644 --- a/net/base/file_stream_posix.cc +++ b/net/base/file_stream_posix.cc @@ -353,9 +353,8 @@ void FileStream::Close() { async_context_.reset(); if (file_ != base::kInvalidPlatformFileValue) { - if (close(file_) != 0) { + if (!base::ClosePlatformFile(file_)) NOTREACHED(); - } file_ = base::kInvalidPlatformFileValue; bound_net_log_.EndEvent(net::NetLog::TYPE_FILE_STREAM_OPEN, NULL); diff --git a/net/base/file_stream_win.cc b/net/base/file_stream_win.cc index 1f7ecbf..9e1f686f 100644 --- a/net/base/file_stream_win.cc +++ b/net/base/file_stream_win.cc @@ -181,7 +181,8 @@ void FileStream::Close() { async_context_.reset(); if (file_ != INVALID_HANDLE_VALUE) { - CloseHandle(file_); + if (!base::ClosePlatformFile(file_)) + NOTREACHED(); file_ = INVALID_HANDLE_VALUE; bound_net_log_.EndEvent(net::NetLog::TYPE_FILE_STREAM_OPEN, NULL); diff --git a/net/url_request/url_request_file_job.cc b/net/url_request/url_request_file_job.cc index d8187ab..8f32750 100644 --- a/net/url_request/url_request_file_job.cc +++ b/net/url_request/url_request_file_job.cc @@ -158,6 +158,9 @@ void URLRequestFileJob::Start() { } void URLRequestFileJob::Kill() { + // URL requests should not block on the disk! + // http://code.google.com/p/chromium/issues/detail?id=59849 + base::ThreadRestrictions::ScopedAllowIO allow_io; stream_.Close(); if (async_resolver_) { diff --git a/webkit/blob/blob_url_request_job.cc b/webkit/blob/blob_url_request_job.cc index 46ffd21..00d8317 100644 --- a/webkit/blob/blob_url_request_job.cc +++ b/webkit/blob/blob_url_request_job.cc @@ -100,6 +100,8 @@ void BlobURLRequestJob::DidStart() { void BlobURLRequestJob::CloseStream() { if (stream_ != NULL) { + // stream_.Close() blocks the IO thread, see http://crbug.com/75548. + base::ThreadRestrictions::ScopedAllowIO allow_io; stream_->Close(); stream_.reset(NULL); } |