diff options
author | huanr@chromium.org <huanr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 23:05:59 +0000 |
---|---|---|
committer | huanr@chromium.org <huanr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 23:05:59 +0000 |
commit | 3828a755146e0102b934281129fdd6425ca19a0f (patch) | |
tree | 636c50ef9cff86b68defe0e19acad8e5ebc33aa7 /net/base/file_stream_win.cc | |
parent | 41291b0e3555aa77d3501c02a75679b1d734d4ee (diff) | |
download | chromium_src-3828a755146e0102b934281129fdd6425ca19a0f.zip chromium_src-3828a755146e0102b934281129fdd6425ca19a0f.tar.gz chromium_src-3828a755146e0102b934281129fdd6425ca19a0f.tar.bz2 |
Avoiding IO completion callback during the closing
of FileStream.
BUG=8942
Review URL: http://codereview.chromium.org/112090
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17560 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/file_stream_win.cc')
-rw-r--r-- | net/base/file_stream_win.cc | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/base/file_stream_win.cc b/net/base/file_stream_win.cc index caa636f..09ad88e 100644 --- a/net/base/file_stream_win.cc +++ b/net/base/file_stream_win.cc @@ -51,7 +51,7 @@ static int MapErrorCode(DWORD err) { class FileStream::AsyncContext : public MessageLoopForIO::IOHandler { public: AsyncContext(FileStream* owner) - : owner_(owner), context_(), callback_(NULL) { + : owner_(owner), context_(), callback_(NULL), is_closing_(false) { context_.handler = this; } ~AsyncContext(); @@ -68,9 +68,11 @@ class FileStream::AsyncContext : public MessageLoopForIO::IOHandler { FileStream* owner_; MessageLoopForIO::IOContext context_; CompletionCallback* callback_; + bool is_closing_; }; FileStream::AsyncContext::~AsyncContext() { + is_closing_ = true; bool waited = false; base::Time start = base::Time::Now(); while (callback_) { @@ -94,6 +96,11 @@ void FileStream::AsyncContext::OnIOCompleted( DCHECK(&context_ == context); DCHECK(callback_); + if (is_closing_) { + callback_ = NULL; + return; + } + int result = static_cast<int>(bytes_read); if (error && error != ERROR_HANDLE_EOF) result = MapErrorCode(error); |