| OLD | NEW |
| 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 #ifndef DataConsumerHandleTestUtil_h | 5 #ifndef DataConsumerHandleTestUtil_h |
| 6 #define DataConsumerHandleTestUtil_h | 6 #define DataConsumerHandleTestUtil_h |
| 7 | 7 |
| 8 #include "bindings/core/v8/ScriptState.h" | 8 #include "bindings/core/v8/ScriptState.h" |
| 9 #include "core/testing/NullExecutionContext.h" | 9 #include "core/testing/NullExecutionContext.h" |
| 10 #include "gin/public/isolate_holder.h" | 10 #include "gin/public/isolate_holder.h" |
| 11 #include "modules/fetch/DataConsumerHandleUtil.h" | 11 #include "modules/fetch/DataConsumerHandleUtil.h" |
| 12 #include "modules/fetch/FetchDataConsumerHandle.h" | 12 #include "modules/fetch/FetchDataConsumerHandle.h" |
| 13 #include "modules/fetch/FetchDataLoader.h" | 13 #include "modules/fetch/FetchDataLoader.h" |
| 14 #include "platform/Task.h" | |
| 15 #include "platform/ThreadSafeFunctional.h" | 14 #include "platform/ThreadSafeFunctional.h" |
| 16 #include "platform/WaitableEvent.h" | 15 #include "platform/WaitableEvent.h" |
| 17 #include "platform/WebThreadSupportingGC.h" | 16 #include "platform/WebThreadSupportingGC.h" |
| 18 #include "platform/heap/Handle.h" | 17 #include "platform/heap/Handle.h" |
| 19 #include "public/platform/Platform.h" | 18 #include "public/platform/Platform.h" |
| 20 #include "public/platform/WebDataConsumerHandle.h" | 19 #include "public/platform/WebDataConsumerHandle.h" |
| 21 #include "public/platform/WebTraceLocation.h" | 20 #include "public/platform/WebTraceLocation.h" |
| 22 #include "wtf/Deque.h" | 21 #include "wtf/Deque.h" |
| 23 #include "wtf/Locker.h" | 22 #include "wtf/Locker.h" |
| 24 #include "wtf/OwnPtr.h" | 23 #include "wtf/OwnPtr.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 MutexLocker locker(m_holderMutex); | 108 MutexLocker locker(m_holderMutex); |
| 110 ASSERT(!m_holder); | 109 ASSERT(!m_holder); |
| 111 m_holder = holder; | 110 m_holder = holder; |
| 112 } | 111 } |
| 113 void unregisterThreadHolder() | 112 void unregisterThreadHolder() |
| 114 { | 113 { |
| 115 MutexLocker locker(m_holderMutex); | 114 MutexLocker locker(m_holderMutex); |
| 116 ASSERT(m_holder); | 115 ASSERT(m_holder); |
| 117 m_holder = nullptr; | 116 m_holder = nullptr; |
| 118 } | 117 } |
| 119 void postTaskToReadingThread(const WebTraceLocation& location, Task*
task) | 118 void postTaskToReadingThread(const WebTraceLocation& location, PassO
wnPtr<Closure> task) |
| 120 { | 119 { |
| 121 MutexLocker locker(m_holderMutex); | 120 MutexLocker locker(m_holderMutex); |
| 122 ASSERT(m_holder); | 121 ASSERT(m_holder); |
| 123 m_holder->readingThread()->postTask(location, task); | 122 m_holder->readingThread()->postTask(location, task); |
| 124 } | 123 } |
| 125 void postTaskToUpdatingThread(const WebTraceLocation& location, Task
* task) | 124 void postTaskToUpdatingThread(const WebTraceLocation& location, Pass
OwnPtr<Closure> task) |
| 126 { | 125 { |
| 127 MutexLocker locker(m_holderMutex); | 126 MutexLocker locker(m_holderMutex); |
| 128 ASSERT(m_holder); | 127 ASSERT(m_holder); |
| 129 m_holder->updatingThread()->postTask(location, task); | 128 m_holder->updatingThread()->postTask(location, task); |
| 130 } | 129 } |
| 131 | 130 |
| 132 private: | 131 private: |
| 133 Context() | 132 Context() |
| 134 : m_holder(nullptr) { } | 133 : m_holder(nullptr) { } |
| 135 String currentThreadName() | 134 String currentThreadName() |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 Reader* obtainReaderInternal(Client*) { return new ReaderImpl(m_name
, m_context); } | 211 Reader* obtainReaderInternal(Client*) { return new ReaderImpl(m_name
, m_context); } |
| 213 const char* debugName() const override { return "ThreadingTestBase::
DataConsumerHandle"; } | 212 const char* debugName() const override { return "ThreadingTestBase::
DataConsumerHandle"; } |
| 214 | 213 |
| 215 const String m_name; | 214 const String m_name; |
| 216 RefPtr<Context> m_context; | 215 RefPtr<Context> m_context; |
| 217 }; | 216 }; |
| 218 | 217 |
| 219 void resetReader() { m_reader = nullptr; } | 218 void resetReader() { m_reader = nullptr; } |
| 220 void signalDone() { m_waitableEvent->signal(); } | 219 void signalDone() { m_waitableEvent->signal(); } |
| 221 const String& result() { return m_context->result(); } | 220 const String& result() { return m_context->result(); } |
| 222 void postTaskToReadingThread(const WebTraceLocation& location, Task* tas
k) | 221 void postTaskToReadingThread(const WebTraceLocation& location, PassOwnPt
r<Closure> task) |
| 223 { | 222 { |
| 224 m_context->postTaskToReadingThread(location, task); | 223 m_context->postTaskToReadingThread(location, task); |
| 225 } | 224 } |
| 226 void postTaskToUpdatingThread(const WebTraceLocation& location, Task* ta
sk) | 225 void postTaskToUpdatingThread(const WebTraceLocation& location, PassOwnP
tr<Closure> task) |
| 227 { | 226 { |
| 228 m_context->postTaskToUpdatingThread(location, task); | 227 m_context->postTaskToUpdatingThread(location, task); |
| 229 } | 228 } |
| 230 void postTaskToReadingThreadAndWait(const WebTraceLocation& location, Ta
sk* task) | 229 void postTaskToReadingThreadAndWait(const WebTraceLocation& location, Pa
ssOwnPtr<Closure> task) |
| 231 { | 230 { |
| 232 postTaskToReadingThread(location, task); | 231 postTaskToReadingThread(location, task); |
| 233 m_waitableEvent->wait(); | 232 m_waitableEvent->wait(); |
| 234 } | 233 } |
| 235 void postTaskToUpdatingThreadAndWait(const WebTraceLocation& location, T
ask* task) | 234 void postTaskToUpdatingThreadAndWait(const WebTraceLocation& location, P
assOwnPtr<Closure> task) |
| 236 { | 235 { |
| 237 postTaskToUpdatingThread(location, task); | 236 postTaskToUpdatingThread(location, task); |
| 238 m_waitableEvent->wait(); | 237 m_waitableEvent->wait(); |
| 239 } | 238 } |
| 240 protected: | 239 protected: |
| 241 ThreadingTestBase() | 240 ThreadingTestBase() |
| 242 : m_context(Context::create()) { } | 241 : m_context(Context::create()) { } |
| 243 | 242 |
| 244 RefPtr<Context> m_context; | 243 RefPtr<Context> m_context; |
| 245 OwnPtr<WebDataConsumerHandle::Reader> m_reader; | 244 OwnPtr<WebDataConsumerHandle::Reader> m_reader; |
| 246 OwnPtr<WaitableEvent> m_waitableEvent; | 245 OwnPtr<WaitableEvent> m_waitableEvent; |
| 247 NoopClient m_client; | 246 NoopClient m_client; |
| 248 }; | 247 }; |
| 249 | 248 |
| 250 class ThreadingHandleNotificationTest : public ThreadingTestBase, public Web
DataConsumerHandle::Client { | 249 class ThreadingHandleNotificationTest : public ThreadingTestBase, public Web
DataConsumerHandle::Client { |
| 251 public: | 250 public: |
| 252 using Self = ThreadingHandleNotificationTest; | 251 using Self = ThreadingHandleNotificationTest; |
| 253 static PassRefPtr<Self> create() { return adoptRef(new Self); } | 252 static PassRefPtr<Self> create() { return adoptRef(new Self); } |
| 254 | 253 |
| 255 void run(PassOwnPtr<WebDataConsumerHandle> handle) | 254 void run(PassOwnPtr<WebDataConsumerHandle> handle) |
| 256 { | 255 { |
| 257 ThreadHolder holder(this); | 256 ThreadHolder holder(this); |
| 258 m_waitableEvent = adoptPtr(new WaitableEvent()); | 257 m_waitableEvent = adoptPtr(new WaitableEvent()); |
| 259 m_handle = handle; | 258 m_handle = handle; |
| 260 | 259 |
| 261 postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeB
ind(&Self::obtainReader, this))); | 260 postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self
::obtainReader, this)); |
| 262 } | 261 } |
| 263 | 262 |
| 264 private: | 263 private: |
| 265 ThreadingHandleNotificationTest() = default; | 264 ThreadingHandleNotificationTest() = default; |
| 266 void obtainReader() | 265 void obtainReader() |
| 267 { | 266 { |
| 268 m_reader = m_handle->obtainReader(this); | 267 m_reader = m_handle->obtainReader(this); |
| 269 } | 268 } |
| 270 void didGetReadable() override | 269 void didGetReadable() override |
| 271 { | 270 { |
| 272 postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Se
lf::resetReader, this))); | 271 postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::reset
Reader, this)); |
| 273 postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Se
lf::signalDone, this))); | 272 postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signa
lDone, this)); |
| 274 } | 273 } |
| 275 | 274 |
| 276 OwnPtr<WebDataConsumerHandle> m_handle; | 275 OwnPtr<WebDataConsumerHandle> m_handle; |
| 277 }; | 276 }; |
| 278 | 277 |
| 279 class ThreadingHandleNoNotificationTest : public ThreadingTestBase, public W
ebDataConsumerHandle::Client { | 278 class ThreadingHandleNoNotificationTest : public ThreadingTestBase, public W
ebDataConsumerHandle::Client { |
| 280 public: | 279 public: |
| 281 using Self = ThreadingHandleNoNotificationTest; | 280 using Self = ThreadingHandleNoNotificationTest; |
| 282 static PassRefPtr<Self> create() { return adoptRef(new Self); } | 281 static PassRefPtr<Self> create() { return adoptRef(new Self); } |
| 283 | 282 |
| 284 void run(PassOwnPtr<WebDataConsumerHandle> handle) | 283 void run(PassOwnPtr<WebDataConsumerHandle> handle) |
| 285 { | 284 { |
| 286 ThreadHolder holder(this); | 285 ThreadHolder holder(this); |
| 287 m_waitableEvent = adoptPtr(new WaitableEvent()); | 286 m_waitableEvent = adoptPtr(new WaitableEvent()); |
| 288 m_handle = handle; | 287 m_handle = handle; |
| 289 | 288 |
| 290 postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeB
ind(&Self::obtainReader, this))); | 289 postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self
::obtainReader, this)); |
| 291 } | 290 } |
| 292 | 291 |
| 293 private: | 292 private: |
| 294 ThreadingHandleNoNotificationTest() = default; | 293 ThreadingHandleNoNotificationTest() = default; |
| 295 void obtainReader() | 294 void obtainReader() |
| 296 { | 295 { |
| 297 m_reader = m_handle->obtainReader(this); | 296 m_reader = m_handle->obtainReader(this); |
| 298 m_reader = nullptr; | 297 m_reader = nullptr; |
| 299 postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Se
lf::signalDone, this))); | 298 postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signa
lDone, this)); |
| 300 } | 299 } |
| 301 void didGetReadable() override | 300 void didGetReadable() override |
| 302 { | 301 { |
| 303 ASSERT_NOT_REACHED(); | 302 ASSERT_NOT_REACHED(); |
| 304 } | 303 } |
| 305 | 304 |
| 306 OwnPtr<WebDataConsumerHandle> m_handle; | 305 OwnPtr<WebDataConsumerHandle> m_handle; |
| 307 }; | 306 }; |
| 308 | 307 |
| 309 class MockFetchDataConsumerHandle : public FetchDataConsumerHandle { | 308 class MockFetchDataConsumerHandle : public FetchDataConsumerHandle { |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 // where T is one of HandleReader and HandleTwophaseReader. | 493 // where T is one of HandleReader and HandleTwophaseReader. |
| 495 template <typename T> | 494 template <typename T> |
| 496 class HandleReaderRunner final { | 495 class HandleReaderRunner final { |
| 497 STACK_ALLOCATED(); | 496 STACK_ALLOCATED(); |
| 498 public: | 497 public: |
| 499 explicit HandleReaderRunner(PassOwnPtr<WebDataConsumerHandle> handle) | 498 explicit HandleReaderRunner(PassOwnPtr<WebDataConsumerHandle> handle) |
| 500 : m_thread(adoptPtr(new Thread("reading thread"))) | 499 : m_thread(adoptPtr(new Thread("reading thread"))) |
| 501 , m_event(adoptPtr(new WaitableEvent())) | 500 , m_event(adoptPtr(new WaitableEvent())) |
| 502 , m_isDone(false) | 501 , m_isDone(false) |
| 503 { | 502 { |
| 504 m_thread->thread()->postTask(BLINK_FROM_HERE, new Task(threadSafeBin
d(&HandleReaderRunner::start, AllowCrossThreadAccess(this), handle))); | 503 m_thread->thread()->postTask(BLINK_FROM_HERE, threadSafeBind(&Handle
ReaderRunner::start, AllowCrossThreadAccess(this), handle)); |
| 505 } | 504 } |
| 506 ~HandleReaderRunner() | 505 ~HandleReaderRunner() |
| 507 { | 506 { |
| 508 wait(); | 507 wait(); |
| 509 } | 508 } |
| 510 | 509 |
| 511 PassOwnPtr<HandleReadResult> wait() | 510 PassOwnPtr<HandleReadResult> wait() |
| 512 { | 511 { |
| 513 if (m_isDone) | 512 if (m_isDone) |
| 514 return nullptr; | 513 return nullptr; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 535 OwnPtr<HandleReadResult> m_result; | 534 OwnPtr<HandleReadResult> m_result; |
| 536 bool m_isDone; | 535 bool m_isDone; |
| 537 | 536 |
| 538 OwnPtr<T> m_handleReader; | 537 OwnPtr<T> m_handleReader; |
| 539 }; | 538 }; |
| 540 }; | 539 }; |
| 541 | 540 |
| 542 } // namespace blink | 541 } // namespace blink |
| 543 | 542 |
| 544 #endif // DataConsumerHandleTestUtil_h | 543 #endif // DataConsumerHandleTestUtil_h |
| OLD | NEW |