| Index: third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp
|
| diff --git a/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp b/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp
|
| deleted file mode 100644
|
| index 035c0b13ca463655fae6352f677e278d501f7ba0..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp
|
| +++ /dev/null
|
| @@ -1,219 +0,0 @@
|
| -// Copyright 2015 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 "modules/fetch/CompositeDataConsumerHandle.h"
|
| -
|
| -#include "platform/CrossThreadFunctional.h"
|
| -#include "public/platform/Platform.h"
|
| -#include "public/platform/WebTaskRunner.h"
|
| -#include "public/platform/WebThread.h"
|
| -#include "public/platform/WebTraceLocation.h"
|
| -#include "wtf/Locker.h"
|
| -#include "wtf/PtrUtil.h"
|
| -#include "wtf/ThreadSafeRefCounted.h"
|
| -#include "wtf/ThreadingPrimitives.h"
|
| -#include <memory>
|
| -
|
| -namespace blink {
|
| -
|
| -using Result = WebDataConsumerHandle::Result;
|
| -
|
| -class CompositeDataConsumerHandle::ReaderImpl final : public WebDataConsumerHandle::Reader {
|
| -public:
|
| - explicit ReaderImpl(PassRefPtr<Context>);
|
| - ~ReaderImpl() override;
|
| - Result read(void* data, size_t /* size */, Flags, size_t* readSize) override;
|
| - Result beginRead(const void** buffer, Flags, size_t* available) override;
|
| - Result endRead(size_t readSize) override;
|
| -
|
| -private:
|
| - RefPtr<Context> m_context;
|
| -};
|
| -
|
| -class CompositeDataConsumerHandle::Context final : public ThreadSafeRefCounted<Context> {
|
| -public:
|
| - using Token = unsigned;
|
| - static PassRefPtr<Context> create(std::unique_ptr<WebDataConsumerHandle> handle) { return adoptRef(new Context(std::move(handle))); }
|
| - ~Context()
|
| - {
|
| - DCHECK(!m_readerThread);
|
| - DCHECK(!m_reader);
|
| - DCHECK(!m_client);
|
| - }
|
| - std::unique_ptr<ReaderImpl> obtainReader(Client* client)
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - DCHECK(!m_readerThread);
|
| - DCHECK(!m_reader);
|
| - DCHECK(!m_client);
|
| - ++m_token;
|
| - m_client = client;
|
| - m_readerThread = Platform::current()->currentThread();
|
| - m_reader = m_handle->obtainReader(m_client);
|
| - return wrapUnique(new ReaderImpl(this));
|
| - }
|
| - void detachReader()
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - DCHECK(m_readerThread);
|
| - DCHECK(m_readerThread->isCurrentThread());
|
| - DCHECK(m_reader);
|
| - DCHECK(!m_isInTwoPhaseRead);
|
| - DCHECK(!m_isUpdateWaitingForEndRead);
|
| - ++m_token;
|
| - m_reader = nullptr;
|
| - m_readerThread = nullptr;
|
| - m_client = nullptr;
|
| - }
|
| - void update(std::unique_ptr<WebDataConsumerHandle> handle)
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - m_handle = std::move(handle);
|
| - if (!m_readerThread) {
|
| - // There is no reader.
|
| - return;
|
| - }
|
| - ++m_token;
|
| - updateReaderNoLock(m_token);
|
| - }
|
| -
|
| - Result read(void* data, size_t size, Flags flags, size_t* readSize)
|
| - {
|
| - DCHECK(m_readerThread && m_readerThread->isCurrentThread());
|
| - return m_reader->read(data, size, flags, readSize);
|
| - }
|
| - Result beginRead(const void** buffer, Flags flags, size_t* available)
|
| - {
|
| - DCHECK(m_readerThread && m_readerThread->isCurrentThread());
|
| - DCHECK(!m_isInTwoPhaseRead);
|
| - Result r = m_reader->beginRead(buffer, flags, available);
|
| - m_isInTwoPhaseRead = (r == Ok);
|
| - return r;
|
| - }
|
| - Result endRead(size_t readSize)
|
| - {
|
| - DCHECK(m_readerThread && m_readerThread->isCurrentThread());
|
| - DCHECK(m_isInTwoPhaseRead);
|
| - Result r = m_reader->endRead(readSize);
|
| - m_isInTwoPhaseRead = false;
|
| - if (m_isUpdateWaitingForEndRead) {
|
| - // We need this lock to access |m_handle|.
|
| - MutexLocker locker(m_mutex);
|
| - m_reader = nullptr;
|
| - m_reader = m_handle->obtainReader(m_client);
|
| - m_isUpdateWaitingForEndRead = false;
|
| - }
|
| - return r;
|
| - }
|
| -
|
| -private:
|
| - explicit Context(std::unique_ptr<WebDataConsumerHandle> handle)
|
| - : m_handle(std::move(handle))
|
| - , m_readerThread(nullptr)
|
| - , m_client(nullptr)
|
| - , m_token(0)
|
| - , m_isUpdateWaitingForEndRead(false)
|
| - , m_isInTwoPhaseRead(false)
|
| - {
|
| - }
|
| - void updateReader(Token token)
|
| - {
|
| - MutexLocker locker(m_mutex);
|
| - updateReaderNoLock(token);
|
| - }
|
| - void updateReaderNoLock(Token token)
|
| - {
|
| - if (token != m_token) {
|
| - // This request is not fresh. Ignore it.
|
| - return;
|
| - }
|
| - DCHECK(m_readerThread);
|
| - DCHECK(m_reader);
|
| - if (m_readerThread->isCurrentThread()) {
|
| - if (m_isInTwoPhaseRead) {
|
| - // We are waiting for the two-phase read completion.
|
| - m_isUpdateWaitingForEndRead = true;
|
| - return;
|
| - }
|
| - // Unregister the old one, then register the new one.
|
| - m_reader = nullptr;
|
| - m_reader = m_handle->obtainReader(m_client);
|
| - return;
|
| - }
|
| - ++m_token;
|
| - m_readerThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, crossThreadBind(&Context::updateReader, wrapPassRefPtr(this), m_token));
|
| - }
|
| -
|
| - std::unique_ptr<Reader> m_reader;
|
| - std::unique_ptr<WebDataConsumerHandle> m_handle;
|
| - // Note: Holding a WebThread raw pointer is not generally safe, but we can
|
| - // do that in this case because:
|
| - // 1. Destructing a ReaderImpl when the bound thread ends is a user's
|
| - // responsibility.
|
| - // 2. |m_readerThread| will never be used after the associated reader is
|
| - // detached.
|
| - WebThread* m_readerThread;
|
| - Client* m_client;
|
| - Token m_token;
|
| - // These boolean values are bound to the reader thread.
|
| - bool m_isUpdateWaitingForEndRead;
|
| - bool m_isInTwoPhaseRead;
|
| - Mutex m_mutex;
|
| -};
|
| -
|
| -CompositeDataConsumerHandle::ReaderImpl::ReaderImpl(PassRefPtr<Context> context) : m_context(context) { }
|
| -
|
| -CompositeDataConsumerHandle::ReaderImpl::~ReaderImpl()
|
| -{
|
| - m_context->detachReader();
|
| -}
|
| -
|
| -Result CompositeDataConsumerHandle::ReaderImpl::read(void* data, size_t size, Flags flags, size_t* readSize)
|
| -{
|
| - return m_context->read(data, size, flags, readSize);
|
| -}
|
| -
|
| -Result CompositeDataConsumerHandle::ReaderImpl::beginRead(const void** buffer, Flags flags, size_t* available)
|
| -{
|
| - return m_context->beginRead(buffer, flags, available);
|
| -}
|
| -
|
| -Result CompositeDataConsumerHandle::ReaderImpl::endRead(size_t readSize)
|
| -{
|
| - return m_context->endRead(readSize);
|
| -}
|
| -
|
| -CompositeDataConsumerHandle::Updater::Updater(PassRefPtr<Context> context)
|
| - : m_context(context)
|
| -#if DCHECK_IS_ON()
|
| - , m_thread(Platform::current()->currentThread())
|
| -#endif
|
| -{
|
| -}
|
| -
|
| -CompositeDataConsumerHandle::Updater::~Updater() {}
|
| -
|
| -void CompositeDataConsumerHandle::Updater::update(std::unique_ptr<WebDataConsumerHandle> handle)
|
| -{
|
| - DCHECK(handle);
|
| -#if DCHECK_IS_ON()
|
| - DCHECK(m_thread->isCurrentThread());
|
| -#endif
|
| - m_context->update(std::move(handle));
|
| -}
|
| -
|
| -CompositeDataConsumerHandle::CompositeDataConsumerHandle(std::unique_ptr<WebDataConsumerHandle> handle, Updater** updater)
|
| - : m_context(Context::create(std::move(handle)))
|
| -{
|
| - *updater = new Updater(m_context);
|
| -}
|
| -
|
| -CompositeDataConsumerHandle::~CompositeDataConsumerHandle() { }
|
| -
|
| -std::unique_ptr<WebDataConsumerHandle::Reader> CompositeDataConsumerHandle::obtainReader(Client* client)
|
| -{
|
| - return m_context->obtainReader(client);
|
| -}
|
| -
|
| -} // namespace blink
|
|
|