Commit 8febfeb0 authored by Yutaka Hirano's avatar Yutaka Hirano Committed by Commit Bot

Use OnceClosure in SharedMemoryDataConsumerHandle

Bug: 911036
Change-Id: I1096638e46760674d9c9a85522f775f767f0faa1
Reviewed-on: https://chromium-review.googlesource.com/c/1370234Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Commit-Queue: Yutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#615450}
parent 1270bcb7
...@@ -53,12 +53,12 @@ using Result = blink::WebDataConsumerHandle::Result; ...@@ -53,12 +53,12 @@ using Result = blink::WebDataConsumerHandle::Result;
class SharedMemoryDataConsumerHandle::Context final class SharedMemoryDataConsumerHandle::Context final
: public base::RefCountedThreadSafe<Context> { : public base::RefCountedThreadSafe<Context> {
public: public:
explicit Context(const base::Closure& on_reader_detached) explicit Context(base::OnceClosure on_reader_detached)
: result_(kOk), : result_(kOk),
first_offset_(0), first_offset_(0),
client_(nullptr), client_(nullptr),
writer_task_runner_(base::ThreadTaskRunnerHandle::Get()), writer_task_runner_(base::ThreadTaskRunnerHandle::Get()),
on_reader_detached_(on_reader_detached), on_reader_detached_(std::move(on_reader_detached)),
is_on_reader_detached_valid_(!on_reader_detached_.is_null()), is_on_reader_detached_valid_(!on_reader_detached_.is_null()),
is_handle_active_(true), is_handle_active_(true),
is_two_phase_read_in_progress_(false) {} is_two_phase_read_in_progress_(false) {}
...@@ -72,10 +72,12 @@ class SharedMemoryDataConsumerHandle::Context final ...@@ -72,10 +72,12 @@ class SharedMemoryDataConsumerHandle::Context final
if (!is_handle_locked() && !is_handle_active()) { if (!is_handle_locked() && !is_handle_active()) {
// No one is interested in the contents. // No one is interested in the contents.
if (is_on_reader_detached_valid_) { if (is_on_reader_detached_valid_) {
is_on_reader_detached_valid_ = false;
// We post a task even in the writer thread in order to avoid a // We post a task even in the writer thread in order to avoid a
// reentrance problem as calling |on_reader_detached_| may manipulate // reentrance problem as calling |on_reader_detached_| may manipulate
// the context synchronously. // the context synchronously.
writer_task_runner_->PostTask(FROM_HERE, on_reader_detached_); writer_task_runner_->PostTask(FROM_HERE,
std::move(on_reader_detached_));
} }
Clear(); Clear();
} }
...@@ -251,7 +253,7 @@ class SharedMemoryDataConsumerHandle::Context final ...@@ -251,7 +253,7 @@ class SharedMemoryDataConsumerHandle::Context final
Client* client_; Client* client_;
scoped_refptr<base::SingleThreadTaskRunner> notification_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> notification_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> writer_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> writer_task_runner_;
base::Closure on_reader_detached_; base::OnceClosure on_reader_detached_;
// We need this boolean variable to remember if |on_reader_detached_| is // We need this boolean variable to remember if |on_reader_detached_| is
// callable because we need to reset |on_reader_detached_| only on the writer // callable because we need to reset |on_reader_detached_| only on the writer
// thread and hence |on_reader_detached_.is_null()| is untrustworthy on // thread and hence |on_reader_detached_.is_null()| is untrustworthy on
...@@ -440,13 +442,13 @@ Result SharedMemoryDataConsumerHandle::ReaderImpl::EndRead(size_t read_size) { ...@@ -440,13 +442,13 @@ Result SharedMemoryDataConsumerHandle::ReaderImpl::EndRead(size_t read_size) {
SharedMemoryDataConsumerHandle::SharedMemoryDataConsumerHandle( SharedMemoryDataConsumerHandle::SharedMemoryDataConsumerHandle(
BackpressureMode mode, BackpressureMode mode,
std::unique_ptr<Writer>* writer) std::unique_ptr<Writer>* writer)
: SharedMemoryDataConsumerHandle(mode, base::Closure(), writer) {} : SharedMemoryDataConsumerHandle(mode, base::OnceClosure(), writer) {}
SharedMemoryDataConsumerHandle::SharedMemoryDataConsumerHandle( SharedMemoryDataConsumerHandle::SharedMemoryDataConsumerHandle(
BackpressureMode mode, BackpressureMode mode,
const base::Closure& on_reader_detached, base::OnceClosure on_reader_detached,
std::unique_ptr<Writer>* writer) std::unique_ptr<Writer>* writer)
: context_(new Context(on_reader_detached)) { : context_(new Context(std::move(on_reader_detached))) {
writer->reset(new Writer(context_, mode)); writer->reset(new Writer(context_, mode));
} }
......
...@@ -79,7 +79,7 @@ class CONTENT_EXPORT SharedMemoryDataConsumerHandle final ...@@ -79,7 +79,7 @@ class CONTENT_EXPORT SharedMemoryDataConsumerHandle final
// context when the writer is detached, i.e. |Close| or |Fail| is called, // context when the writer is detached, i.e. |Close| or |Fail| is called,
// and the callback will never be called. // and the callback will never be called.
SharedMemoryDataConsumerHandle(BackpressureMode mode, SharedMemoryDataConsumerHandle(BackpressureMode mode,
const base::Closure& on_reader_detached, base::OnceClosure on_reader_detached,
std::unique_ptr<Writer>* writer); std::unique_ptr<Writer>* writer);
~SharedMemoryDataConsumerHandle() override; ~SharedMemoryDataConsumerHandle() override;
......
...@@ -657,7 +657,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed1) { ...@@ -657,7 +657,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed1) {
checkpoint.Call(0); checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle( handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure, kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_)); base::BindOnce(&DestructionTrackingFunction::Call, on_clear), &writer_));
handle_.reset(); handle_.reset();
on_clear = nullptr; on_clear = nullptr;
checkpoint.Call(1); checkpoint.Call(1);
...@@ -683,7 +683,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed2) { ...@@ -683,7 +683,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed2) {
checkpoint.Call(0); checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle( handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure, kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_)); base::BindOnce(&DestructionTrackingFunction::Call, on_clear), &writer_));
auto reader = handle_->ObtainReader( auto reader = handle_->ObtainReader(
nullptr, blink::scheduler::GetSingleThreadTaskRunnerForTesting()); nullptr, blink::scheduler::GetSingleThreadTaskRunnerForTesting());
handle_.reset(); handle_.reset();
...@@ -713,7 +713,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenDone) { ...@@ -713,7 +713,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenDone) {
checkpoint.Call(0); checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle( handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure, kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_)); base::BindOnce(&DestructionTrackingFunction::Call, on_clear), &writer_));
on_clear = nullptr; on_clear = nullptr;
checkpoint.Call(1); checkpoint.Call(1);
writer_->Close(); writer_->Close();
...@@ -740,7 +740,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenErrored) { ...@@ -740,7 +740,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenErrored) {
checkpoint.Call(0); checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle( handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure, kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_)); base::BindOnce(&DestructionTrackingFunction::Call, on_clear), &writer_));
on_clear = nullptr; on_clear = nullptr;
checkpoint.Call(1); checkpoint.Call(1);
writer_->Fail(); writer_->Fail();
......
...@@ -862,7 +862,7 @@ void WebURLLoaderImpl::Context::OnReceivedResponse( ...@@ -862,7 +862,7 @@ void WebURLLoaderImpl::Context::OnReceivedResponse(
} }
auto read_handle = std::make_unique<SharedMemoryDataConsumerHandle>( auto read_handle = std::make_unique<SharedMemoryDataConsumerHandle>(
mode, base::Bind(&Context::CancelBodyStreaming, this), mode, base::BindOnce(&Context::CancelBodyStreaming, this),
&body_stream_writer_); &body_stream_writer_);
// Here |body_stream_writer_| has an indirect reference to |this| and that // Here |body_stream_writer_| has an indirect reference to |this| and that
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment