|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "net/base/test_completion_callback.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/bind_helpers.h" | 
|  | #include "base/compiler_specific.h" | 
|  | #include "base/message_loop/message_loop.h" | 
|  | #include "net/base/io_buffer.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | namespace internal { | 
|  |  | 
|  | void TestCompletionCallbackBaseInternal::DidSetResult() { | 
|  | have_result_ = true; | 
|  | if (waiting_for_result_) | 
|  | base::MessageLoop::current()->Quit(); | 
|  | } | 
|  |  | 
|  | void TestCompletionCallbackBaseInternal::WaitForResult() { | 
|  | DCHECK(!waiting_for_result_); | 
|  | while (!have_result_) { | 
|  | waiting_for_result_ = true; | 
|  | base::MessageLoop::current()->Run(); | 
|  | waiting_for_result_ = false; | 
|  | } | 
|  | have_result_ = false;  // Auto-reset for next callback. | 
|  | } | 
|  |  | 
|  | TestCompletionCallbackBaseInternal::TestCompletionCallbackBaseInternal() | 
|  | : have_result_(false), | 
|  | waiting_for_result_(false) { | 
|  | } | 
|  |  | 
|  | TestCompletionCallbackBaseInternal::~TestCompletionCallbackBaseInternal() { | 
|  | } | 
|  |  | 
|  | }  // namespace internal | 
|  |  | 
|  | TestClosure::TestClosure() | 
|  | : closure_(base::Bind(&TestClosure::DidSetResult, base::Unretained(this))) { | 
|  | } | 
|  |  | 
|  | TestClosure::~TestClosure() { | 
|  | } | 
|  |  | 
|  | TestCompletionCallback::TestCompletionCallback() | 
|  | : callback_(base::Bind(&TestCompletionCallback::SetResult, | 
|  | base::Unretained(this))) { | 
|  | } | 
|  |  | 
|  | TestCompletionCallback::~TestCompletionCallback() { | 
|  | } | 
|  |  | 
|  | TestInt64CompletionCallback::TestInt64CompletionCallback() | 
|  | : callback_(base::Bind(&TestInt64CompletionCallback::SetResult, | 
|  | base::Unretained(this))) { | 
|  | } | 
|  |  | 
|  | TestInt64CompletionCallback::~TestInt64CompletionCallback() { | 
|  | } | 
|  |  | 
|  | ReleaseBufferCompletionCallback::ReleaseBufferCompletionCallback( | 
|  | IOBuffer* buffer) : buffer_(buffer) { | 
|  | } | 
|  |  | 
|  | ReleaseBufferCompletionCallback::~ReleaseBufferCompletionCallback() { | 
|  | } | 
|  |  | 
|  | void ReleaseBufferCompletionCallback::SetResult(int result) { | 
|  | if (!buffer_->HasOneRef()) | 
|  | result = net::ERR_FAILED; | 
|  | TestCompletionCallback::SetResult(result); | 
|  | } | 
|  |  | 
|  | }  // namespace net |