summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-03 04:40:21 +0000
committersatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-03 04:40:21 +0000
commit1d04d7299fa371256bfa07dc4c9efd1553b0792f (patch)
treefc15bd500994632604de8daeb27f17d92b891ad9
parent7fff3291749da0ed6cc82188b42019b3d3be91cf (diff)
downloadchromium_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.cc6
-rw-r--r--content/browser/renderer_host/redirect_to_file_resource_handler.cc2
-rw-r--r--net/base/file_stream_posix.cc3
-rw-r--r--net/base/file_stream_win.cc3
-rw-r--r--net/url_request/url_request_file_job.cc3
-rw-r--r--webkit/blob/blob_url_request_job.cc2
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);
}