Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp

Issue 2050123002: Remove OwnPtr from Blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: First attempt to land. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/fetch/CompositeDataConsumerHandle.h" 5 #include "modules/fetch/CompositeDataConsumerHandle.h"
6 6
7 #include "platform/ThreadSafeFunctional.h" 7 #include "platform/ThreadSafeFunctional.h"
8 #include "public/platform/Platform.h" 8 #include "public/platform/Platform.h"
9 #include "public/platform/WebTaskRunner.h" 9 #include "public/platform/WebTaskRunner.h"
10 #include "public/platform/WebThread.h" 10 #include "public/platform/WebThread.h"
11 #include "public/platform/WebTraceLocation.h" 11 #include "public/platform/WebTraceLocation.h"
12 #include "wtf/Locker.h" 12 #include "wtf/Locker.h"
13 #include "wtf/PtrUtil.h"
13 #include "wtf/ThreadSafeRefCounted.h" 14 #include "wtf/ThreadSafeRefCounted.h"
14 #include "wtf/ThreadingPrimitives.h" 15 #include "wtf/ThreadingPrimitives.h"
16 #include <memory>
15 17
16 namespace blink { 18 namespace blink {
17 19
18 using Result = WebDataConsumerHandle::Result; 20 using Result = WebDataConsumerHandle::Result;
19 21
20 class CompositeDataConsumerHandle::ReaderImpl final : public WebDataConsumerHand le::Reader { 22 class CompositeDataConsumerHandle::ReaderImpl final : public WebDataConsumerHand le::Reader {
21 public: 23 public:
22 explicit ReaderImpl(PassRefPtr<Context>); 24 explicit ReaderImpl(PassRefPtr<Context>);
23 ~ReaderImpl() override; 25 ~ReaderImpl() override;
24 Result read(void* data, size_t /* size */, Flags, size_t* readSize) override ; 26 Result read(void* data, size_t /* size */, Flags, size_t* readSize) override ;
25 Result beginRead(const void** buffer, Flags, size_t* available) override; 27 Result beginRead(const void** buffer, Flags, size_t* available) override;
26 Result endRead(size_t readSize) override; 28 Result endRead(size_t readSize) override;
27 29
28 private: 30 private:
29 RefPtr<Context> m_context; 31 RefPtr<Context> m_context;
30 }; 32 };
31 33
32 class CompositeDataConsumerHandle::Context final : public ThreadSafeRefCounted<C ontext> { 34 class CompositeDataConsumerHandle::Context final : public ThreadSafeRefCounted<C ontext> {
33 public: 35 public:
34 using Token = unsigned; 36 using Token = unsigned;
35 static PassRefPtr<Context> create(PassOwnPtr<WebDataConsumerHandle> handle) { return adoptRef(new Context(std::move(handle))); } 37 static PassRefPtr<Context> create(std::unique_ptr<WebDataConsumerHandle> han dle) { return adoptRef(new Context(std::move(handle))); }
36 ~Context() 38 ~Context()
37 { 39 {
38 ASSERT(!m_readerThread); 40 ASSERT(!m_readerThread);
39 ASSERT(!m_reader); 41 ASSERT(!m_reader);
40 ASSERT(!m_client); 42 ASSERT(!m_client);
41 } 43 }
42 PassOwnPtr<ReaderImpl> obtainReader(Client* client) 44 std::unique_ptr<ReaderImpl> obtainReader(Client* client)
43 { 45 {
44 MutexLocker locker(m_mutex); 46 MutexLocker locker(m_mutex);
45 ASSERT(!m_readerThread); 47 ASSERT(!m_readerThread);
46 ASSERT(!m_reader); 48 ASSERT(!m_reader);
47 ASSERT(!m_client); 49 ASSERT(!m_client);
48 ++m_token; 50 ++m_token;
49 m_client = client; 51 m_client = client;
50 m_readerThread = Platform::current()->currentThread(); 52 m_readerThread = Platform::current()->currentThread();
51 m_reader = m_handle->obtainReader(m_client); 53 m_reader = m_handle->obtainReader(m_client);
52 return adoptPtr(new ReaderImpl(this)); 54 return wrapUnique(new ReaderImpl(this));
53 } 55 }
54 void detachReader() 56 void detachReader()
55 { 57 {
56 MutexLocker locker(m_mutex); 58 MutexLocker locker(m_mutex);
57 ASSERT(m_readerThread); 59 ASSERT(m_readerThread);
58 ASSERT(m_readerThread->isCurrentThread()); 60 ASSERT(m_readerThread->isCurrentThread());
59 ASSERT(m_reader); 61 ASSERT(m_reader);
60 ASSERT(!m_isInTwoPhaseRead); 62 ASSERT(!m_isInTwoPhaseRead);
61 ASSERT(!m_isUpdateWaitingForEndRead); 63 ASSERT(!m_isUpdateWaitingForEndRead);
62 ++m_token; 64 ++m_token;
63 m_reader = nullptr; 65 m_reader = nullptr;
64 m_readerThread = nullptr; 66 m_readerThread = nullptr;
65 m_client = nullptr; 67 m_client = nullptr;
66 } 68 }
67 void update(PassOwnPtr<WebDataConsumerHandle> handle) 69 void update(std::unique_ptr<WebDataConsumerHandle> handle)
68 { 70 {
69 MutexLocker locker(m_mutex); 71 MutexLocker locker(m_mutex);
70 m_handle = std::move(handle); 72 m_handle = std::move(handle);
71 if (!m_readerThread) { 73 if (!m_readerThread) {
72 // There is no reader. 74 // There is no reader.
73 return; 75 return;
74 } 76 }
75 ++m_token; 77 ++m_token;
76 updateReaderNoLock(m_token); 78 updateReaderNoLock(m_token);
77 } 79 }
(...skipping 21 matching lines...) Expand all
99 // We need this lock to access |m_handle|. 101 // We need this lock to access |m_handle|.
100 MutexLocker locker(m_mutex); 102 MutexLocker locker(m_mutex);
101 m_reader = nullptr; 103 m_reader = nullptr;
102 m_reader = m_handle->obtainReader(m_client); 104 m_reader = m_handle->obtainReader(m_client);
103 m_isUpdateWaitingForEndRead = false; 105 m_isUpdateWaitingForEndRead = false;
104 } 106 }
105 return r; 107 return r;
106 } 108 }
107 109
108 private: 110 private:
109 explicit Context(PassOwnPtr<WebDataConsumerHandle> handle) 111 explicit Context(std::unique_ptr<WebDataConsumerHandle> handle)
110 : m_handle(std::move(handle)) 112 : m_handle(std::move(handle))
111 , m_readerThread(nullptr) 113 , m_readerThread(nullptr)
112 , m_client(nullptr) 114 , m_client(nullptr)
113 , m_token(0) 115 , m_token(0)
114 , m_isUpdateWaitingForEndRead(false) 116 , m_isUpdateWaitingForEndRead(false)
115 , m_isInTwoPhaseRead(false) 117 , m_isInTwoPhaseRead(false)
116 { 118 {
117 } 119 }
118 void updateReader(Token token) 120 void updateReader(Token token)
119 { 121 {
(...skipping 16 matching lines...) Expand all
136 } 138 }
137 // Unregister the old one, then register the new one. 139 // Unregister the old one, then register the new one.
138 m_reader = nullptr; 140 m_reader = nullptr;
139 m_reader = m_handle->obtainReader(m_client); 141 m_reader = m_handle->obtainReader(m_client);
140 return; 142 return;
141 } 143 }
142 ++m_token; 144 ++m_token;
143 m_readerThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafe Bind(&Context::updateReader, this, m_token)); 145 m_readerThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafe Bind(&Context::updateReader, this, m_token));
144 } 146 }
145 147
146 OwnPtr<Reader> m_reader; 148 std::unique_ptr<Reader> m_reader;
147 OwnPtr<WebDataConsumerHandle> m_handle; 149 std::unique_ptr<WebDataConsumerHandle> m_handle;
148 // Note: Holding a WebThread raw pointer is not generally safe, but we can 150 // Note: Holding a WebThread raw pointer is not generally safe, but we can
149 // do that in this case because: 151 // do that in this case because:
150 // 1. Destructing a ReaderImpl when the bound thread ends is a user's 152 // 1. Destructing a ReaderImpl when the bound thread ends is a user's
151 // responsibility. 153 // responsibility.
152 // 2. |m_readerThread| will never be used after the associated reader is 154 // 2. |m_readerThread| will never be used after the associated reader is
153 // detached. 155 // detached.
154 WebThread* m_readerThread; 156 WebThread* m_readerThread;
155 Client* m_client; 157 Client* m_client;
156 Token m_token; 158 Token m_token;
157 // These boolean values are bound to the reader thread. 159 // These boolean values are bound to the reader thread.
(...skipping 27 matching lines...) Expand all
185 CompositeDataConsumerHandle::Updater::Updater(PassRefPtr<Context> context) 187 CompositeDataConsumerHandle::Updater::Updater(PassRefPtr<Context> context)
186 : m_context(context) 188 : m_context(context)
187 #if ENABLE(ASSERT) 189 #if ENABLE(ASSERT)
188 , m_thread(Platform::current()->currentThread()) 190 , m_thread(Platform::current()->currentThread())
189 #endif 191 #endif
190 { 192 {
191 } 193 }
192 194
193 CompositeDataConsumerHandle::Updater::~Updater() {} 195 CompositeDataConsumerHandle::Updater::~Updater() {}
194 196
195 void CompositeDataConsumerHandle::Updater::update(PassOwnPtr<WebDataConsumerHand le> handle) 197 void CompositeDataConsumerHandle::Updater::update(std::unique_ptr<WebDataConsume rHandle> handle)
196 { 198 {
197 ASSERT(handle); 199 ASSERT(handle);
198 ASSERT(m_thread->isCurrentThread()); 200 ASSERT(m_thread->isCurrentThread());
199 m_context->update(std::move(handle)); 201 m_context->update(std::move(handle));
200 } 202 }
201 203
202 CompositeDataConsumerHandle::CompositeDataConsumerHandle(PassOwnPtr<WebDataConsu merHandle> handle, Updater** updater) 204 CompositeDataConsumerHandle::CompositeDataConsumerHandle(std::unique_ptr<WebData ConsumerHandle> handle, Updater** updater)
203 : m_context(Context::create(std::move(handle))) 205 : m_context(Context::create(std::move(handle)))
204 { 206 {
205 *updater = new Updater(m_context); 207 *updater = new Updater(m_context);
206 } 208 }
207 209
208 CompositeDataConsumerHandle::~CompositeDataConsumerHandle() { } 210 CompositeDataConsumerHandle::~CompositeDataConsumerHandle() { }
209 211
210 WebDataConsumerHandle::Reader* CompositeDataConsumerHandle::obtainReaderInternal (Client* client) 212 WebDataConsumerHandle::Reader* CompositeDataConsumerHandle::obtainReaderInternal (Client* client)
211 { 213 {
212 return m_context->obtainReader(client).leakPtr(); 214 return m_context->obtainReader(client).release();
213 } 215 }
214 216
215 } // namespace blink 217 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698