haikuwebkit/Source/WTF/wtf/SynchronizedFixedQueue.h

132 lines
3.7 KiB
C
Raw Permalink Normal View History

Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
/*
* Copyright (C) 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
Drop CheckedLock / CheckedCondition aliases https://bugs.webkit.org/show_bug.cgi?id=226176 Reviewed by Kate Cheney. Drop CheckedLock / CheckedCondition aliases now that they are the default. Source/JavaScriptCore: * API/JSVirtualMachine.mm: * API/glib/JSCVirtualMachine.cpp: * assembler/PerfLog.h: * assembler/testmasm.cpp: * bytecode/StructureStubInfo.h: * bytecode/SuperSampler.cpp: * dfg/DFGCommon.cpp: * dfg/DFGCommonData.cpp: * dfg/DFGPlan.h: * dfg/DFGThreadData.h: * dfg/DFGWorklist.cpp: (JSC::DFG::Worklist::Worklist): * dfg/DFGWorklist.h: * disassembler/Disassembler.cpp: * dynbench.cpp: * heap/BlockDirectory.cpp: (JSC::BlockDirectory::parallelNotEmptyBlockSource): * heap/BlockDirectory.h: (JSC::BlockDirectory::bitvectorLock): * heap/CodeBlockSet.h: (JSC::CodeBlockSet::getLock): * heap/Heap.cpp: (JSC::Heap::Heap): * heap/Heap.h: * heap/IsoSubspacePerVM.h: * heap/MarkedSpace.h: (JSC::MarkedSpace::directoryLock): * heap/MarkingConstraintSolver.h: * heap/SlotVisitor.cpp: (JSC::SlotVisitor::donateKnownParallel): * heap/SlotVisitor.h: * inspector/remote/socket/RemoteInspectorConnectionClient.h: * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * jit/ExecutableAllocator.cpp: (JSC::ExecutableAllocator::getLock const): (JSC::dumpJITMemory): * jit/ExecutableAllocator.h: (JSC::ExecutableAllocatorBase::getLock const): * jit/JITWorklist.cpp: (JSC::JITWorklist::JITWorklist): * jit/JITWorklist.h: * jsc.cpp: * profiler/ProfilerDatabase.h: * runtime/ConcurrentJSLock.h: * runtime/DeferredWorkTimer.h: * runtime/JSLock.h: * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::FrameWalker): (JSC::CFrameWalker::CFrameWalker): (JSC::SamplingProfiler::takeSample): * runtime/SamplingProfiler.h: (JSC::SamplingProfiler::getLock): * runtime/VM.h: * runtime/VMTraps.cpp: (JSC::VMTraps::invalidateCodeBlocksOnStack): (JSC::VMTraps::VMTraps): * runtime/VMTraps.h: * tools/FunctionOverrides.h: * tools/VMInspector.cpp: (JSC::ensureIsSafeToLock): * tools/VMInspector.h: (JSC::VMInspector::getLock): * wasm/WasmCalleeRegistry.h: (JSC::Wasm::CalleeRegistry::getLock): * wasm/WasmPlan.h: * wasm/WasmStreamingCompiler.h: * wasm/WasmThunks.h: * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::Worklist): * wasm/WasmWorklist.h: Source/WebCore: * Modules/indexeddb/IDBObjectStore.h: * Modules/indexeddb/IDBTransaction.h: * Modules/indexeddb/client/IDBConnectionProxy.h: * Modules/indexeddb/server/IDBSerializationContext.cpp: * Modules/indexeddb/server/IDBServer.cpp: * Modules/mediastream/RTCDataChannel.cpp: * Modules/mediastream/RTCRtpSFrameTransformer.h: * Modules/mediastream/RTCRtpScriptTransform.h: * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h: * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.h: * Modules/speech/SpeechRecognitionCaptureSourceImpl.h: * Modules/webaudio/AudioParamTimeline.h: * Modules/webaudio/MediaElementAudioSourceNode.h: * Modules/webdatabase/Database.cpp: * Modules/webdatabase/Database.h: * Modules/webdatabase/DatabaseManager.h: * Modules/webdatabase/DatabaseTask.h: * Modules/webdatabase/DatabaseThread.h: * Modules/webdatabase/DatabaseTracker.cpp: (WebCore::DatabaseTracker::openDatabaseMutex): * Modules/webdatabase/DatabaseTracker.h: * Modules/webdatabase/OriginLock.cpp: * Modules/webdatabase/SQLCallbackWrapper.h: * Modules/webdatabase/SQLTransaction.h: * Modules/webgpu/WebGPUDevice.cpp: (WebCore::WebGPUDevice::instancesLock): * Modules/webgpu/WebGPUDevice.h: * Modules/webgpu/WebGPUPipeline.cpp: (WebCore::WebGPUPipeline::instancesLock): * Modules/webgpu/WebGPUPipeline.h: * Modules/websockets/WebSocket.cpp: (WebCore::WebSocket::allActiveWebSocketsLock): * Modules/websockets/WebSocket.h: * accessibility/isolatedtree/AXIsolatedTree.cpp: * accessibility/isolatedtree/AXIsolatedTree.h: * bindings/js/JSDOMGlobalObject.h: * bridge/objc/WebScriptObject.mm: * crypto/CryptoAlgorithmRegistry.h: * dom/MessagePort.cpp: * dom/Node.cpp: * dom/ScriptExecutionContext.cpp: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::createMediaPlayer): * html/canvas/CanvasRenderingContext.cpp: (WebCore::CanvasRenderingContext::instancesLock): * html/canvas/CanvasRenderingContext.h: * html/canvas/WebGLContextGroup.cpp: (WebCore::WebGLContextGroup::objectGraphLockForAContext): * html/canvas/WebGLContextGroup.h: * html/canvas/WebGLContextObject.cpp: (WebCore::WebGLContextObject::objectGraphLockForContext): * html/canvas/WebGLContextObject.h: * html/canvas/WebGLObject.h: * html/canvas/WebGLProgram.cpp: (WebCore::WebGLProgram::instancesLock): * html/canvas/WebGLProgram.h: * html/canvas/WebGLRenderingContextBase.cpp: (WebCore::WebGLRenderingContextBase::objectGraphLock): * html/canvas/WebGLRenderingContextBase.h: * html/canvas/WebGLSharedObject.cpp: (WebCore::WebGLSharedObject::objectGraphLockForContext): * html/canvas/WebGLSharedObject.h: * inspector/agents/WebHeapAgent.cpp: * page/ResourceUsageThread.h: * page/SecurityPolicy.cpp: * page/WheelEventTestMonitor.h: * page/scrolling/ScrollingTree.h: (WebCore::ScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/ScrollingTreeLatchingController.h: * page/scrolling/ThreadedScrollingTree.h: (WebCore::ThreadedScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/mac/ScrollingTreeMac.h: * platform/AbortableTaskQueue.h: * platform/GenericTaskQueue.cpp: * platform/GenericTaskQueue.h: * platform/LegacySchemeRegistry.cpp: * platform/audio/AudioDestination.h: * platform/audio/HRTFDatabaseLoader.h: * platform/audio/ReverbConvolver.cpp: (WebCore::ReverbConvolver::backgroundThreadEntry): * platform/audio/cocoa/AudioDestinationCocoa.h: * platform/audio/gstreamer/AudioSourceProviderGStreamer.h: * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: * platform/audio/mac/FFTFrameMac.cpp: * platform/encryptedmedia/CDMProxy.h: * platform/graphics/MediaPlayer.cpp: * platform/graphics/ShadowBlur.cpp: (WebCore::ScratchBuffer::lock): (WebCore::ShadowBlur::drawRectShadowWithTiling): (WebCore::ShadowBlur::drawInsetShadowWithTiling): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm: * platform/graphics/cg/IOSurfacePool.h: * platform/graphics/cg/SubimageCacheWithTimer.h: * platform/graphics/cocoa/FontCacheCoreText.cpp: * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: * platform/graphics/gstreamer/VideoSinkGStreamer.cpp: * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: * platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp: * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp: * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): * platform/image-decoders/ScalableImageDecoder.h: * platform/ios/QuickLook.mm: * platform/ios/WebSQLiteDatabaseTrackerClient.mm: * platform/ios/wak/WebCoreThreadRun.cpp: * platform/mediarecorder/MediaRecorderPrivateMock.h: * platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h: * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeOutgoingAudioSource.h: * platform/mediastream/RealtimeOutgoingVideoSource.h: * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: * platform/mediastream/gstreamer/RealtimeOutgoingAudioSourceLibWebRTC.h: * platform/network/cf/LoaderRunLoopCF.cpp: (WebCore::loaderRunLoop): * platform/network/cocoa/WebCoreNSURLSession.mm: * platform/network/mac/UTIUtilities.mm: * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h: * platform/sql/SQLiteDatabase.cpp: * platform/sql/SQLiteDatabase.h: * platform/sql/SQLiteDatabaseTracker.cpp: * platform/text/TextEncodingRegistry.cpp: * storage/StorageQuotaManager.h: * workers/WorkerGlobalScope.cpp: * workers/WorkerOrWorkletScriptController.h: * workers/WorkerOrWorkletThread.cpp: (WebCore::WorkerOrWorkletThread::workerOrWorkletThreadsLock): * workers/WorkerOrWorkletThread.h: * worklets/PaintWorkletGlobalScope.h: Source/WebKit: * GPUProcess/graphics/RemoteGraphicsContextGL.cpp: (WebKit::RemoteGraphicsContextGL::paintPixelBufferToImageBuffer): * GPUProcess/webrtc/LibWebRTCCodecsProxy.h: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h: * NetworkProcess/CustomProtocols/LegacyCustomProtocolManager.h: * NetworkProcess/IndexedDB/WebIDBServer.cpp: * NetworkProcess/NetworkProcess.h: * NetworkProcess/WebStorage/StorageManagerSet.h: * NetworkProcess/cache/NetworkCacheStorage.cpp: * NetworkProcess/cocoa/LaunchServicesDatabaseObserver.h: * NetworkProcess/glib/DNSCache.h: * Platform/IPC/Connection.cpp: * Platform/IPC/Connection.h: * Platform/IPC/StreamConnectionWorkQueue.h: * Platform/IPC/StreamServerConnection.h: * Shared/BlockingResponseMap.h: * Shared/Cocoa/XPCEndpointClient.h: * Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h: * Shared/mac/MediaFormatReader/MediaFormatReader.h: * Shared/mac/MediaFormatReader/MediaSampleCursor.h: * Shared/mac/MediaFormatReader/MediaTrackReader.h: * UIProcess/API/glib/IconDatabase.h: * UIProcess/WebURLSchemeTask.h: * UIProcess/mac/DisplayLink.h: * UIProcess/mac/WKPrintingView.mm: (-[WKPrintingView knowsPageRange:]): * WebProcess/GPU/graphics/RemoteImageBufferProxy.h: * WebProcess/GPU/webrtc/LibWebRTCCodecs.h: * WebProcess/Network/WebSocketStream.cpp: * WebProcess/Plugins/PluginProcessConnectionManager.h: * WebProcess/WebPage/EventDispatcher.h: * WebProcess/WebPage/ViewUpdateDispatcher.h: Source/WebKitLegacy: * Storage/StorageAreaSync.h: Source/WebKitLegacy/mac: * DOM/DOMInternal.mm: Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/Assertions.cpp: * wtf/AutomaticThread.cpp: (WTF::AutomaticThreadCondition::wait): (WTF::AutomaticThreadCondition::waitFor): (WTF::AutomaticThread::AutomaticThread): * wtf/AutomaticThread.h: * wtf/CMakeLists.txt: * wtf/CheckedCondition.h: Removed. * wtf/CheckedLock.h: Removed. * wtf/Condition.h: * wtf/CrossThreadQueue.h: * wtf/CrossThreadTaskHandler.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/FastMalloc.cpp: * wtf/Forward.h: * wtf/Language.cpp: * wtf/Lock.cpp: (WTF::UncheckedLock::lockSlow): (WTF::UncheckedLock::unlockSlow): (WTF::UncheckedLock::unlockFairlySlow): (WTF::UncheckedLock::safepointSlow): * wtf/Lock.h: (WTF::WTF_ASSERTS_ACQUIRED_LOCK): * wtf/Logger.cpp: * wtf/Logger.h: (WTF::Logger::WTF_RETURNS_LOCK): * wtf/MessageQueue.h: * wtf/MetaAllocator.cpp: (WTF::MetaAllocator::release): (WTF::MetaAllocator::MetaAllocator): (WTF::MetaAllocator::allocate): (WTF::MetaAllocator::currentStatistics): * wtf/MetaAllocator.h: * wtf/OSLogPrintStream.h: * wtf/ParallelHelperPool.cpp: (WTF::ParallelHelperPool::ParallelHelperPool): * wtf/ParallelHelperPool.h: * wtf/ParallelJobsGeneric.h: * wtf/ParallelVectorIterator.h: * wtf/ReadWriteLock.h: * wtf/RecursiveLockAdapter.h: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsLock): * wtf/Threading.h: * wtf/TimingScope.cpp: * wtf/URL.cpp: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/WorkerPool.cpp: (WTF::WorkerPool::WorkerPool): * wtf/WorkerPool.h: * wtf/cf/LanguageCF.cpp: * wtf/text/AtomStringImpl.cpp: (WTF::AtomStringTableLocker::AtomStringTableLocker): * wtf/text/StringView.cpp: * wtf/threads/BinarySemaphore.h: * wtf/unicode/icu/CollatorICU.cpp: Tools: * TestWebKitAPI/CMakeLists.txt: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedConditionTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/CheckedLockTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/Condition.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/Lock.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/MetaAllocator.cpp: * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp: (WTR::AXThread::createThreadIfNeeded): Canonical link: https://commits.webkit.org/238085@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277958 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-24 18:29:01 +00:00
#include <wtf/Condition.h>
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
#include <wtf/Deque.h>
Drop CheckedLock / CheckedCondition aliases https://bugs.webkit.org/show_bug.cgi?id=226176 Reviewed by Kate Cheney. Drop CheckedLock / CheckedCondition aliases now that they are the default. Source/JavaScriptCore: * API/JSVirtualMachine.mm: * API/glib/JSCVirtualMachine.cpp: * assembler/PerfLog.h: * assembler/testmasm.cpp: * bytecode/StructureStubInfo.h: * bytecode/SuperSampler.cpp: * dfg/DFGCommon.cpp: * dfg/DFGCommonData.cpp: * dfg/DFGPlan.h: * dfg/DFGThreadData.h: * dfg/DFGWorklist.cpp: (JSC::DFG::Worklist::Worklist): * dfg/DFGWorklist.h: * disassembler/Disassembler.cpp: * dynbench.cpp: * heap/BlockDirectory.cpp: (JSC::BlockDirectory::parallelNotEmptyBlockSource): * heap/BlockDirectory.h: (JSC::BlockDirectory::bitvectorLock): * heap/CodeBlockSet.h: (JSC::CodeBlockSet::getLock): * heap/Heap.cpp: (JSC::Heap::Heap): * heap/Heap.h: * heap/IsoSubspacePerVM.h: * heap/MarkedSpace.h: (JSC::MarkedSpace::directoryLock): * heap/MarkingConstraintSolver.h: * heap/SlotVisitor.cpp: (JSC::SlotVisitor::donateKnownParallel): * heap/SlotVisitor.h: * inspector/remote/socket/RemoteInspectorConnectionClient.h: * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * jit/ExecutableAllocator.cpp: (JSC::ExecutableAllocator::getLock const): (JSC::dumpJITMemory): * jit/ExecutableAllocator.h: (JSC::ExecutableAllocatorBase::getLock const): * jit/JITWorklist.cpp: (JSC::JITWorklist::JITWorklist): * jit/JITWorklist.h: * jsc.cpp: * profiler/ProfilerDatabase.h: * runtime/ConcurrentJSLock.h: * runtime/DeferredWorkTimer.h: * runtime/JSLock.h: * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::FrameWalker): (JSC::CFrameWalker::CFrameWalker): (JSC::SamplingProfiler::takeSample): * runtime/SamplingProfiler.h: (JSC::SamplingProfiler::getLock): * runtime/VM.h: * runtime/VMTraps.cpp: (JSC::VMTraps::invalidateCodeBlocksOnStack): (JSC::VMTraps::VMTraps): * runtime/VMTraps.h: * tools/FunctionOverrides.h: * tools/VMInspector.cpp: (JSC::ensureIsSafeToLock): * tools/VMInspector.h: (JSC::VMInspector::getLock): * wasm/WasmCalleeRegistry.h: (JSC::Wasm::CalleeRegistry::getLock): * wasm/WasmPlan.h: * wasm/WasmStreamingCompiler.h: * wasm/WasmThunks.h: * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::Worklist): * wasm/WasmWorklist.h: Source/WebCore: * Modules/indexeddb/IDBObjectStore.h: * Modules/indexeddb/IDBTransaction.h: * Modules/indexeddb/client/IDBConnectionProxy.h: * Modules/indexeddb/server/IDBSerializationContext.cpp: * Modules/indexeddb/server/IDBServer.cpp: * Modules/mediastream/RTCDataChannel.cpp: * Modules/mediastream/RTCRtpSFrameTransformer.h: * Modules/mediastream/RTCRtpScriptTransform.h: * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h: * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.h: * Modules/speech/SpeechRecognitionCaptureSourceImpl.h: * Modules/webaudio/AudioParamTimeline.h: * Modules/webaudio/MediaElementAudioSourceNode.h: * Modules/webdatabase/Database.cpp: * Modules/webdatabase/Database.h: * Modules/webdatabase/DatabaseManager.h: * Modules/webdatabase/DatabaseTask.h: * Modules/webdatabase/DatabaseThread.h: * Modules/webdatabase/DatabaseTracker.cpp: (WebCore::DatabaseTracker::openDatabaseMutex): * Modules/webdatabase/DatabaseTracker.h: * Modules/webdatabase/OriginLock.cpp: * Modules/webdatabase/SQLCallbackWrapper.h: * Modules/webdatabase/SQLTransaction.h: * Modules/webgpu/WebGPUDevice.cpp: (WebCore::WebGPUDevice::instancesLock): * Modules/webgpu/WebGPUDevice.h: * Modules/webgpu/WebGPUPipeline.cpp: (WebCore::WebGPUPipeline::instancesLock): * Modules/webgpu/WebGPUPipeline.h: * Modules/websockets/WebSocket.cpp: (WebCore::WebSocket::allActiveWebSocketsLock): * Modules/websockets/WebSocket.h: * accessibility/isolatedtree/AXIsolatedTree.cpp: * accessibility/isolatedtree/AXIsolatedTree.h: * bindings/js/JSDOMGlobalObject.h: * bridge/objc/WebScriptObject.mm: * crypto/CryptoAlgorithmRegistry.h: * dom/MessagePort.cpp: * dom/Node.cpp: * dom/ScriptExecutionContext.cpp: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::createMediaPlayer): * html/canvas/CanvasRenderingContext.cpp: (WebCore::CanvasRenderingContext::instancesLock): * html/canvas/CanvasRenderingContext.h: * html/canvas/WebGLContextGroup.cpp: (WebCore::WebGLContextGroup::objectGraphLockForAContext): * html/canvas/WebGLContextGroup.h: * html/canvas/WebGLContextObject.cpp: (WebCore::WebGLContextObject::objectGraphLockForContext): * html/canvas/WebGLContextObject.h: * html/canvas/WebGLObject.h: * html/canvas/WebGLProgram.cpp: (WebCore::WebGLProgram::instancesLock): * html/canvas/WebGLProgram.h: * html/canvas/WebGLRenderingContextBase.cpp: (WebCore::WebGLRenderingContextBase::objectGraphLock): * html/canvas/WebGLRenderingContextBase.h: * html/canvas/WebGLSharedObject.cpp: (WebCore::WebGLSharedObject::objectGraphLockForContext): * html/canvas/WebGLSharedObject.h: * inspector/agents/WebHeapAgent.cpp: * page/ResourceUsageThread.h: * page/SecurityPolicy.cpp: * page/WheelEventTestMonitor.h: * page/scrolling/ScrollingTree.h: (WebCore::ScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/ScrollingTreeLatchingController.h: * page/scrolling/ThreadedScrollingTree.h: (WebCore::ThreadedScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/mac/ScrollingTreeMac.h: * platform/AbortableTaskQueue.h: * platform/GenericTaskQueue.cpp: * platform/GenericTaskQueue.h: * platform/LegacySchemeRegistry.cpp: * platform/audio/AudioDestination.h: * platform/audio/HRTFDatabaseLoader.h: * platform/audio/ReverbConvolver.cpp: (WebCore::ReverbConvolver::backgroundThreadEntry): * platform/audio/cocoa/AudioDestinationCocoa.h: * platform/audio/gstreamer/AudioSourceProviderGStreamer.h: * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: * platform/audio/mac/FFTFrameMac.cpp: * platform/encryptedmedia/CDMProxy.h: * platform/graphics/MediaPlayer.cpp: * platform/graphics/ShadowBlur.cpp: (WebCore::ScratchBuffer::lock): (WebCore::ShadowBlur::drawRectShadowWithTiling): (WebCore::ShadowBlur::drawInsetShadowWithTiling): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm: * platform/graphics/cg/IOSurfacePool.h: * platform/graphics/cg/SubimageCacheWithTimer.h: * platform/graphics/cocoa/FontCacheCoreText.cpp: * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: * platform/graphics/gstreamer/VideoSinkGStreamer.cpp: * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: * platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp: * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp: * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): * platform/image-decoders/ScalableImageDecoder.h: * platform/ios/QuickLook.mm: * platform/ios/WebSQLiteDatabaseTrackerClient.mm: * platform/ios/wak/WebCoreThreadRun.cpp: * platform/mediarecorder/MediaRecorderPrivateMock.h: * platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h: * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeOutgoingAudioSource.h: * platform/mediastream/RealtimeOutgoingVideoSource.h: * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: * platform/mediastream/gstreamer/RealtimeOutgoingAudioSourceLibWebRTC.h: * platform/network/cf/LoaderRunLoopCF.cpp: (WebCore::loaderRunLoop): * platform/network/cocoa/WebCoreNSURLSession.mm: * platform/network/mac/UTIUtilities.mm: * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h: * platform/sql/SQLiteDatabase.cpp: * platform/sql/SQLiteDatabase.h: * platform/sql/SQLiteDatabaseTracker.cpp: * platform/text/TextEncodingRegistry.cpp: * storage/StorageQuotaManager.h: * workers/WorkerGlobalScope.cpp: * workers/WorkerOrWorkletScriptController.h: * workers/WorkerOrWorkletThread.cpp: (WebCore::WorkerOrWorkletThread::workerOrWorkletThreadsLock): * workers/WorkerOrWorkletThread.h: * worklets/PaintWorkletGlobalScope.h: Source/WebKit: * GPUProcess/graphics/RemoteGraphicsContextGL.cpp: (WebKit::RemoteGraphicsContextGL::paintPixelBufferToImageBuffer): * GPUProcess/webrtc/LibWebRTCCodecsProxy.h: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h: * NetworkProcess/CustomProtocols/LegacyCustomProtocolManager.h: * NetworkProcess/IndexedDB/WebIDBServer.cpp: * NetworkProcess/NetworkProcess.h: * NetworkProcess/WebStorage/StorageManagerSet.h: * NetworkProcess/cache/NetworkCacheStorage.cpp: * NetworkProcess/cocoa/LaunchServicesDatabaseObserver.h: * NetworkProcess/glib/DNSCache.h: * Platform/IPC/Connection.cpp: * Platform/IPC/Connection.h: * Platform/IPC/StreamConnectionWorkQueue.h: * Platform/IPC/StreamServerConnection.h: * Shared/BlockingResponseMap.h: * Shared/Cocoa/XPCEndpointClient.h: * Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h: * Shared/mac/MediaFormatReader/MediaFormatReader.h: * Shared/mac/MediaFormatReader/MediaSampleCursor.h: * Shared/mac/MediaFormatReader/MediaTrackReader.h: * UIProcess/API/glib/IconDatabase.h: * UIProcess/WebURLSchemeTask.h: * UIProcess/mac/DisplayLink.h: * UIProcess/mac/WKPrintingView.mm: (-[WKPrintingView knowsPageRange:]): * WebProcess/GPU/graphics/RemoteImageBufferProxy.h: * WebProcess/GPU/webrtc/LibWebRTCCodecs.h: * WebProcess/Network/WebSocketStream.cpp: * WebProcess/Plugins/PluginProcessConnectionManager.h: * WebProcess/WebPage/EventDispatcher.h: * WebProcess/WebPage/ViewUpdateDispatcher.h: Source/WebKitLegacy: * Storage/StorageAreaSync.h: Source/WebKitLegacy/mac: * DOM/DOMInternal.mm: Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/Assertions.cpp: * wtf/AutomaticThread.cpp: (WTF::AutomaticThreadCondition::wait): (WTF::AutomaticThreadCondition::waitFor): (WTF::AutomaticThread::AutomaticThread): * wtf/AutomaticThread.h: * wtf/CMakeLists.txt: * wtf/CheckedCondition.h: Removed. * wtf/CheckedLock.h: Removed. * wtf/Condition.h: * wtf/CrossThreadQueue.h: * wtf/CrossThreadTaskHandler.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/FastMalloc.cpp: * wtf/Forward.h: * wtf/Language.cpp: * wtf/Lock.cpp: (WTF::UncheckedLock::lockSlow): (WTF::UncheckedLock::unlockSlow): (WTF::UncheckedLock::unlockFairlySlow): (WTF::UncheckedLock::safepointSlow): * wtf/Lock.h: (WTF::WTF_ASSERTS_ACQUIRED_LOCK): * wtf/Logger.cpp: * wtf/Logger.h: (WTF::Logger::WTF_RETURNS_LOCK): * wtf/MessageQueue.h: * wtf/MetaAllocator.cpp: (WTF::MetaAllocator::release): (WTF::MetaAllocator::MetaAllocator): (WTF::MetaAllocator::allocate): (WTF::MetaAllocator::currentStatistics): * wtf/MetaAllocator.h: * wtf/OSLogPrintStream.h: * wtf/ParallelHelperPool.cpp: (WTF::ParallelHelperPool::ParallelHelperPool): * wtf/ParallelHelperPool.h: * wtf/ParallelJobsGeneric.h: * wtf/ParallelVectorIterator.h: * wtf/ReadWriteLock.h: * wtf/RecursiveLockAdapter.h: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsLock): * wtf/Threading.h: * wtf/TimingScope.cpp: * wtf/URL.cpp: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/WorkerPool.cpp: (WTF::WorkerPool::WorkerPool): * wtf/WorkerPool.h: * wtf/cf/LanguageCF.cpp: * wtf/text/AtomStringImpl.cpp: (WTF::AtomStringTableLocker::AtomStringTableLocker): * wtf/text/StringView.cpp: * wtf/threads/BinarySemaphore.h: * wtf/unicode/icu/CollatorICU.cpp: Tools: * TestWebKitAPI/CMakeLists.txt: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedConditionTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/CheckedLockTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/Condition.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/Lock.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/MetaAllocator.cpp: * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp: (WTR::AXThread::createThreadIfNeeded): Canonical link: https://commits.webkit.org/238085@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277958 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-24 18:29:01 +00:00
#include <wtf/Lock.h>
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
#include <wtf/ThreadSafeRefCounted.h>
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
namespace WTF {
template<typename T, size_t BufferSize>
[WTF][JSC] Make JSC and WTF aggressively-fast-malloced https://bugs.webkit.org/show_bug.cgi?id=200611 Reviewed by Saam Barati. Source/JavaScriptCore: This patch aggressively puts many classes into FastMalloc. In JSC side, we grep `std::make_unique` etc. to find potentially system-malloc-allocated classes. After this patch, all the JSC related allocations in JetStream2 cli is done from bmalloc. In the future, it would be nice that we add `WTF::makeUnique<T>` helper function and throw a compile error if `T` is not FastMalloc annotated[1]. Putting WebKit classes in FastMalloc has many benefits. 1. Simply, it is fast. 2. vmmap can tell the amount of memory used for WebKit. 3. bmalloc can isolate WebKit memory allocation from the rest of the world. This is useful since we can know more about what component is corrupting the memory from the memory corruption crash. [1]: https://bugs.webkit.org/show_bug.cgi?id=200620 * API/ObjCCallbackFunction.mm: * assembler/AbstractMacroAssembler.h: * b3/B3PhiChildren.h: * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h: * b3/air/AirDisassembler.h: * bytecode/AccessCaseSnippetParams.h: * bytecode/CallVariant.h: * bytecode/DeferredSourceDump.h: * bytecode/ExecutionCounter.h: * bytecode/GetByIdStatus.h: * bytecode/GetByIdVariant.h: * bytecode/InByIdStatus.h: * bytecode/InByIdVariant.h: * bytecode/InstanceOfStatus.h: * bytecode/InstanceOfVariant.h: * bytecode/PutByIdStatus.h: * bytecode/PutByIdVariant.h: * bytecode/ValueProfile.h: * dfg/DFGAbstractInterpreter.h: * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::newVariableAccessData): * dfg/DFGFlowIndexing.h: * dfg/DFGFlowMap.h: * dfg/DFGLiveCatchVariablePreservationPhase.cpp: (JSC::DFG::LiveCatchVariablePreservationPhase::newVariableAccessData): * dfg/DFGMaximalFlushInsertionPhase.cpp: (JSC::DFG::MaximalFlushInsertionPhase::newVariableAccessData): * dfg/DFGOSRExit.h: * dfg/DFGSpeculativeJIT.h: * dfg/DFGVariableAccessData.h: * disassembler/ARM64/A64DOpcode.h: * inspector/remote/socket/RemoteInspectorMessageParser.h: * inspector/remote/socket/RemoteInspectorSocket.h: * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * jit/PCToCodeOriginMap.h: * runtime/BasicBlockLocation.h: * runtime/DoublePredictionFuzzerAgent.h: * runtime/JSRunLoopTimer.h: * runtime/PromiseDeferredTimer.h: (JSC::PromiseDeferredTimer::create): PromiseDeferredTimer should be allocated as `Ref<>` instead of `std::unique_ptr` since it is inheriting ThreadSafeRefCounted<>. Holding such a class with std::unique_ptr could lead to potentially dangerous operations (like, someone holds it with Ref<> while it is deleted by std::unique_ptr<>). * runtime/RandomizingFuzzerAgent.h: * runtime/SymbolTable.h: * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: * tools/JSDollarVM.cpp: * tools/SigillCrashAnalyzer.cpp: * wasm/WasmFormat.h: * wasm/WasmMemory.cpp: * wasm/WasmSignature.h: * yarr/YarrJIT.h: Source/WebCore: Changed the accessor since we changed std::unique_ptr to Ref for this field. No behavior change. * bindings/js/WorkerScriptController.cpp: (WebCore::WorkerScriptController::addTimerSetNotification): (WebCore::WorkerScriptController::removeTimerSetNotification): Source/WTF: WTF has many data structures, in particular, containers. And these containers can be allocated like `std::make_unique<Container>()`. Without WTF_MAKE_FAST_ALLOCATED, this container itself is allocated from the system malloc. This patch attaches WTF_MAKE_FAST_ALLOCATED more aggressively not to allocate them from the system malloc. And we add some `final` to containers and classes that would be never inherited. * wtf/Assertions.cpp: * wtf/Atomics.h: * wtf/AutodrainedPool.h: * wtf/Bag.h: (WTF::Bag::Bag): Deleted. (WTF::Bag::~Bag): Deleted. (WTF::Bag::clear): Deleted. (WTF::Bag::add): Deleted. (WTF::Bag::iterator::iterator): Deleted. (WTF::Bag::iterator::operator! const): Deleted. (WTF::Bag::iterator::operator* const): Deleted. (WTF::Bag::iterator::operator++): Deleted. (WTF::Bag::iterator::operator== const): Deleted. (WTF::Bag::iterator::operator!= const): Deleted. (WTF::Bag::begin): Deleted. (WTF::Bag::begin const): Deleted. (WTF::Bag::end const): Deleted. (WTF::Bag::isEmpty const): Deleted. (WTF::Bag::unwrappedHead const): Deleted. * wtf/BitVector.h: (WTF::BitVector::BitVector): Deleted. (WTF::BitVector::~BitVector): Deleted. (WTF::BitVector::operator=): Deleted. (WTF::BitVector::size const): Deleted. (WTF::BitVector::ensureSize): Deleted. (WTF::BitVector::quickGet const): Deleted. (WTF::BitVector::quickSet): Deleted. (WTF::BitVector::quickClear): Deleted. (WTF::BitVector::get const): Deleted. (WTF::BitVector::contains const): Deleted. (WTF::BitVector::set): Deleted. (WTF::BitVector::add): Deleted. (WTF::BitVector::ensureSizeAndSet): Deleted. (WTF::BitVector::clear): Deleted. (WTF::BitVector::remove): Deleted. (WTF::BitVector::merge): Deleted. (WTF::BitVector::filter): Deleted. (WTF::BitVector::exclude): Deleted. (WTF::BitVector::bitCount const): Deleted. (WTF::BitVector::isEmpty const): Deleted. (WTF::BitVector::findBit const): Deleted. (WTF::BitVector::isEmptyValue const): Deleted. (WTF::BitVector::isDeletedValue const): Deleted. (WTF::BitVector::isEmptyOrDeletedValue const): Deleted. (WTF::BitVector::operator== const): Deleted. (WTF::BitVector::hash const): Deleted. (WTF::BitVector::iterator::iterator): Deleted. (WTF::BitVector::iterator::operator* const): Deleted. (WTF::BitVector::iterator::operator++): Deleted. (WTF::BitVector::iterator::isAtEnd const): Deleted. (WTF::BitVector::iterator::operator== const): Deleted. (WTF::BitVector::iterator::operator!= const): Deleted. (WTF::BitVector::begin const): Deleted. (WTF::BitVector::end const): Deleted. (WTF::BitVector::bitsInPointer): Deleted. (WTF::BitVector::maxInlineBits): Deleted. (WTF::BitVector::byteCount): Deleted. (WTF::BitVector::makeInlineBits): Deleted. (WTF::BitVector::cleanseInlineBits): Deleted. (WTF::BitVector::bitCount): Deleted. (WTF::BitVector::findBitFast const): Deleted. (WTF::BitVector::findBitSimple const): Deleted. (WTF::BitVector::OutOfLineBits::numBits const): Deleted. (WTF::BitVector::OutOfLineBits::numWords const): Deleted. (WTF::BitVector::OutOfLineBits::bits): Deleted. (WTF::BitVector::OutOfLineBits::bits const): Deleted. (WTF::BitVector::OutOfLineBits::OutOfLineBits): Deleted. (WTF::BitVector::isInline const): Deleted. (WTF::BitVector::outOfLineBits const): Deleted. (WTF::BitVector::outOfLineBits): Deleted. (WTF::BitVector::bits): Deleted. (WTF::BitVector::bits const): Deleted. * wtf/Bitmap.h: (WTF::Bitmap::size): Deleted. (WTF::Bitmap::iterator::iterator): Deleted. (WTF::Bitmap::iterator::operator* const): Deleted. (WTF::Bitmap::iterator::operator++): Deleted. (WTF::Bitmap::iterator::operator== const): Deleted. (WTF::Bitmap::iterator::operator!= const): Deleted. (WTF::Bitmap::begin const): Deleted. (WTF::Bitmap::end const): Deleted. * wtf/Box.h: * wtf/BumpPointerAllocator.h: * wtf/CPUTime.h: * wtf/CheckedBoolean.h: * wtf/CommaPrinter.h: (WTF::CommaPrinter::CommaPrinter): Deleted. (WTF::CommaPrinter::dump const): Deleted. (WTF::CommaPrinter::didPrint const): Deleted. * wtf/CompactPointerTuple.h: (WTF::CompactPointerTuple::encodeType): Deleted. (WTF::CompactPointerTuple::decodeType): Deleted. (WTF::CompactPointerTuple::CompactPointerTuple): Deleted. (WTF::CompactPointerTuple::pointer const): Deleted. (WTF::CompactPointerTuple::setPointer): Deleted. (WTF::CompactPointerTuple::type const): Deleted. (WTF::CompactPointerTuple::setType): Deleted. * wtf/CompilationThread.h: (WTF::CompilationScope::CompilationScope): Deleted. (WTF::CompilationScope::~CompilationScope): Deleted. (WTF::CompilationScope::leaveEarly): Deleted. * wtf/CompletionHandler.h: (WTF::CompletionHandler<Out): (WTF::Detail::CallableWrapper<CompletionHandler<Out): (WTF::CompletionHandlerCallingScope::CompletionHandlerCallingScope): Deleted. (WTF::CompletionHandlerCallingScope::~CompletionHandlerCallingScope): Deleted. (WTF::CompletionHandlerCallingScope::CompletionHandler<void): Deleted. * wtf/ConcurrentBuffer.h: (WTF::ConcurrentBuffer::ConcurrentBuffer): Deleted. (WTF::ConcurrentBuffer::~ConcurrentBuffer): Deleted. (WTF::ConcurrentBuffer::growExact): Deleted. (WTF::ConcurrentBuffer::grow): Deleted. (WTF::ConcurrentBuffer::array const): Deleted. (WTF::ConcurrentBuffer::operator[]): Deleted. (WTF::ConcurrentBuffer::operator[] const): Deleted. (WTF::ConcurrentBuffer::createArray): Deleted. * wtf/ConcurrentPtrHashSet.h: (WTF::ConcurrentPtrHashSet::contains): Deleted. (WTF::ConcurrentPtrHashSet::add): Deleted. (WTF::ConcurrentPtrHashSet::size const): Deleted. (WTF::ConcurrentPtrHashSet::Table::maxLoad const): Deleted. (WTF::ConcurrentPtrHashSet::hash): Deleted. (WTF::ConcurrentPtrHashSet::cast): Deleted. (WTF::ConcurrentPtrHashSet::containsImpl const): Deleted. (WTF::ConcurrentPtrHashSet::addImpl): Deleted. * wtf/ConcurrentVector.h: (WTF::ConcurrentVector::~ConcurrentVector): Deleted. (WTF::ConcurrentVector::size const): Deleted. (WTF::ConcurrentVector::isEmpty const): Deleted. (WTF::ConcurrentVector::at): Deleted. (WTF::ConcurrentVector::at const): Deleted. (WTF::ConcurrentVector::operator[]): Deleted. (WTF::ConcurrentVector::operator[] const): Deleted. (WTF::ConcurrentVector::first): Deleted. (WTF::ConcurrentVector::first const): Deleted. (WTF::ConcurrentVector::last): Deleted. (WTF::ConcurrentVector::last const): Deleted. (WTF::ConcurrentVector::takeLast): Deleted. (WTF::ConcurrentVector::append): Deleted. (WTF::ConcurrentVector::alloc): Deleted. (WTF::ConcurrentVector::removeLast): Deleted. (WTF::ConcurrentVector::grow): Deleted. (WTF::ConcurrentVector::begin): Deleted. (WTF::ConcurrentVector::end): Deleted. (WTF::ConcurrentVector::segmentExistsFor): Deleted. (WTF::ConcurrentVector::segmentFor): Deleted. (WTF::ConcurrentVector::subscriptFor): Deleted. (WTF::ConcurrentVector::ensureSegmentsFor): Deleted. (WTF::ConcurrentVector::ensureSegment): Deleted. (WTF::ConcurrentVector::allocateSegment): Deleted. * wtf/Condition.h: (WTF::Condition::waitUntil): Deleted. (WTF::Condition::waitFor): Deleted. (WTF::Condition::wait): Deleted. (WTF::Condition::notifyOne): Deleted. (WTF::Condition::notifyAll): Deleted. * wtf/CountingLock.h: (WTF::CountingLock::LockHooks::lockHook): Deleted. (WTF::CountingLock::LockHooks::unlockHook): Deleted. (WTF::CountingLock::LockHooks::parkHook): Deleted. (WTF::CountingLock::LockHooks::handoffHook): Deleted. (WTF::CountingLock::tryLock): Deleted. (WTF::CountingLock::lock): Deleted. (WTF::CountingLock::unlock): Deleted. (WTF::CountingLock::isHeld const): Deleted. (WTF::CountingLock::isLocked const): Deleted. (WTF::CountingLock::Count::operator bool const): Deleted. (WTF::CountingLock::Count::operator== const): Deleted. (WTF::CountingLock::Count::operator!= const): Deleted. (WTF::CountingLock::tryOptimisticRead): Deleted. (WTF::CountingLock::validate): Deleted. (WTF::CountingLock::doOptimizedRead): Deleted. (WTF::CountingLock::tryOptimisticFencelessRead): Deleted. (WTF::CountingLock::fencelessValidate): Deleted. (WTF::CountingLock::doOptimizedFencelessRead): Deleted. (WTF::CountingLock::getCount): Deleted. * wtf/CrossThreadQueue.h: * wtf/CrossThreadTask.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/DataMutex.h: * wtf/DateMath.h: * wtf/Deque.h: (WTF::Deque::size const): Deleted. (WTF::Deque::isEmpty const): Deleted. (WTF::Deque::begin): Deleted. (WTF::Deque::end): Deleted. (WTF::Deque::begin const): Deleted. (WTF::Deque::end const): Deleted. (WTF::Deque::rbegin): Deleted. (WTF::Deque::rend): Deleted. (WTF::Deque::rbegin const): Deleted. (WTF::Deque::rend const): Deleted. (WTF::Deque::first): Deleted. (WTF::Deque::first const): Deleted. (WTF::Deque::last): Deleted. (WTF::Deque::last const): Deleted. (WTF::Deque::append): Deleted. * wtf/Dominators.h: * wtf/DoublyLinkedList.h: * wtf/Expected.h: * wtf/FastBitVector.h: * wtf/FileMetadata.h: * wtf/FileSystem.h: * wtf/GraphNodeWorklist.h: * wtf/GregorianDateTime.h: (WTF::GregorianDateTime::GregorianDateTime): Deleted. (WTF::GregorianDateTime::year const): Deleted. (WTF::GregorianDateTime::month const): Deleted. (WTF::GregorianDateTime::yearDay const): Deleted. (WTF::GregorianDateTime::monthDay const): Deleted. (WTF::GregorianDateTime::weekDay const): Deleted. (WTF::GregorianDateTime::hour const): Deleted. (WTF::GregorianDateTime::minute const): Deleted. (WTF::GregorianDateTime::second const): Deleted. (WTF::GregorianDateTime::utcOffset const): Deleted. (WTF::GregorianDateTime::isDST const): Deleted. (WTF::GregorianDateTime::setYear): Deleted. (WTF::GregorianDateTime::setMonth): Deleted. (WTF::GregorianDateTime::setYearDay): Deleted. (WTF::GregorianDateTime::setMonthDay): Deleted. (WTF::GregorianDateTime::setWeekDay): Deleted. (WTF::GregorianDateTime::setHour): Deleted. (WTF::GregorianDateTime::setMinute): Deleted. (WTF::GregorianDateTime::setSecond): Deleted. (WTF::GregorianDateTime::setUtcOffset): Deleted. (WTF::GregorianDateTime::setIsDST): Deleted. (WTF::GregorianDateTime::operator tm const): Deleted. (WTF::GregorianDateTime::copyFrom): Deleted. * wtf/HashTable.h: * wtf/Hasher.h: * wtf/HexNumber.h: * wtf/Indenter.h: * wtf/IndexMap.h: * wtf/IndexSet.h: * wtf/IndexSparseSet.h: * wtf/IndexedContainerIterator.h: * wtf/Insertion.h: * wtf/IteratorAdaptors.h: * wtf/IteratorRange.h: * wtf/KeyValuePair.h: * wtf/ListHashSet.h: (WTF::ListHashSet::begin): Deleted. (WTF::ListHashSet::end): Deleted. (WTF::ListHashSet::begin const): Deleted. (WTF::ListHashSet::end const): Deleted. (WTF::ListHashSet::random): Deleted. (WTF::ListHashSet::random const): Deleted. (WTF::ListHashSet::rbegin): Deleted. (WTF::ListHashSet::rend): Deleted. (WTF::ListHashSet::rbegin const): Deleted. (WTF::ListHashSet::rend const): Deleted. * wtf/Liveness.h: * wtf/LocklessBag.h: (WTF::LocklessBag::LocklessBag): Deleted. (WTF::LocklessBag::add): Deleted. (WTF::LocklessBag::iterate): Deleted. (WTF::LocklessBag::consumeAll): Deleted. (WTF::LocklessBag::consumeAllWithNode): Deleted. (WTF::LocklessBag::~LocklessBag): Deleted. * wtf/LoggingHashID.h: * wtf/MD5.h: * wtf/MachSendRight.h: * wtf/MainThreadData.h: * wtf/Markable.h: * wtf/MediaTime.h: * wtf/MemoryPressureHandler.h: * wtf/MessageQueue.h: (WTF::MessageQueue::MessageQueue): Deleted. * wtf/MetaAllocator.h: * wtf/MonotonicTime.h: (WTF::MonotonicTime::MonotonicTime): Deleted. (WTF::MonotonicTime::fromRawSeconds): Deleted. (WTF::MonotonicTime::infinity): Deleted. (WTF::MonotonicTime::nan): Deleted. (WTF::MonotonicTime::secondsSinceEpoch const): Deleted. (WTF::MonotonicTime::approximateMonotonicTime const): Deleted. (WTF::MonotonicTime::operator bool const): Deleted. (WTF::MonotonicTime::operator+ const): Deleted. (WTF::MonotonicTime::operator- const): Deleted. (WTF::MonotonicTime::operator% const): Deleted. (WTF::MonotonicTime::operator+=): Deleted. (WTF::MonotonicTime::operator-=): Deleted. (WTF::MonotonicTime::operator== const): Deleted. (WTF::MonotonicTime::operator!= const): Deleted. (WTF::MonotonicTime::operator< const): Deleted. (WTF::MonotonicTime::operator> const): Deleted. (WTF::MonotonicTime::operator<= const): Deleted. (WTF::MonotonicTime::operator>= const): Deleted. (WTF::MonotonicTime::isolatedCopy const): Deleted. (WTF::MonotonicTime::encode const): Deleted. (WTF::MonotonicTime::decode): Deleted. * wtf/NaturalLoops.h: * wtf/NoLock.h: * wtf/OSAllocator.h: * wtf/OptionSet.h: * wtf/Optional.h: * wtf/OrderMaker.h: * wtf/Packed.h: (WTF::alignof): * wtf/PackedIntVector.h: (WTF::PackedIntVector::PackedIntVector): Deleted. (WTF::PackedIntVector::operator=): Deleted. (WTF::PackedIntVector::size const): Deleted. (WTF::PackedIntVector::ensureSize): Deleted. (WTF::PackedIntVector::resize): Deleted. (WTF::PackedIntVector::clearAll): Deleted. (WTF::PackedIntVector::get const): Deleted. (WTF::PackedIntVector::set): Deleted. (WTF::PackedIntVector::mask): Deleted. * wtf/PageBlock.h: * wtf/ParallelJobsOpenMP.h: * wtf/ParkingLot.h: * wtf/PriorityQueue.h: (WTF::PriorityQueue::size const): Deleted. (WTF::PriorityQueue::isEmpty const): Deleted. (WTF::PriorityQueue::enqueue): Deleted. (WTF::PriorityQueue::peek const): Deleted. (WTF::PriorityQueue::dequeue): Deleted. (WTF::PriorityQueue::decreaseKey): Deleted. (WTF::PriorityQueue::increaseKey): Deleted. (WTF::PriorityQueue::begin const): Deleted. (WTF::PriorityQueue::end const): Deleted. (WTF::PriorityQueue::isValidHeap const): Deleted. (WTF::PriorityQueue::parentOf): Deleted. (WTF::PriorityQueue::leftChildOf): Deleted. (WTF::PriorityQueue::rightChildOf): Deleted. (WTF::PriorityQueue::siftUp): Deleted. (WTF::PriorityQueue::siftDown): Deleted. * wtf/RandomDevice.h: * wtf/Range.h: * wtf/RangeSet.h: (WTF::RangeSet::RangeSet): Deleted. (WTF::RangeSet::~RangeSet): Deleted. (WTF::RangeSet::add): Deleted. (WTF::RangeSet::contains const): Deleted. (WTF::RangeSet::overlaps const): Deleted. (WTF::RangeSet::clear): Deleted. (WTF::RangeSet::dump const): Deleted. (WTF::RangeSet::dumpRaw const): Deleted. (WTF::RangeSet::begin const): Deleted. (WTF::RangeSet::end const): Deleted. (WTF::RangeSet::addAll): Deleted. (WTF::RangeSet::compact): Deleted. (WTF::RangeSet::overlapsNonEmpty): Deleted. (WTF::RangeSet::subsumesNonEmpty): Deleted. (WTF::RangeSet::findRange const): Deleted. * wtf/RecursableLambda.h: * wtf/RedBlackTree.h: (WTF::RedBlackTree::Node::successor const): Deleted. (WTF::RedBlackTree::Node::predecessor const): Deleted. (WTF::RedBlackTree::Node::successor): Deleted. (WTF::RedBlackTree::Node::predecessor): Deleted. (WTF::RedBlackTree::Node::reset): Deleted. (WTF::RedBlackTree::Node::parent const): Deleted. (WTF::RedBlackTree::Node::setParent): Deleted. (WTF::RedBlackTree::Node::left const): Deleted. (WTF::RedBlackTree::Node::setLeft): Deleted. (WTF::RedBlackTree::Node::right const): Deleted. (WTF::RedBlackTree::Node::setRight): Deleted. (WTF::RedBlackTree::Node::color const): Deleted. (WTF::RedBlackTree::Node::setColor): Deleted. (WTF::RedBlackTree::RedBlackTree): Deleted. (WTF::RedBlackTree::insert): Deleted. (WTF::RedBlackTree::remove): Deleted. (WTF::RedBlackTree::findExact const): Deleted. (WTF::RedBlackTree::findLeastGreaterThanOrEqual const): Deleted. (WTF::RedBlackTree::findGreatestLessThanOrEqual const): Deleted. (WTF::RedBlackTree::first const): Deleted. (WTF::RedBlackTree::last const): Deleted. (WTF::RedBlackTree::size): Deleted. (WTF::RedBlackTree::isEmpty): Deleted. (WTF::RedBlackTree::treeMinimum): Deleted. (WTF::RedBlackTree::treeMaximum): Deleted. (WTF::RedBlackTree::treeInsert): Deleted. (WTF::RedBlackTree::leftRotate): Deleted. (WTF::RedBlackTree::rightRotate): Deleted. (WTF::RedBlackTree::removeFixup): Deleted. * wtf/ResourceUsage.h: * wtf/RunLoop.cpp: * wtf/RunLoopTimer.h: * wtf/SHA1.h: * wtf/Seconds.h: (WTF::Seconds::Seconds): Deleted. (WTF::Seconds::value const): Deleted. (WTF::Seconds::minutes const): Deleted. (WTF::Seconds::seconds const): Deleted. (WTF::Seconds::milliseconds const): Deleted. (WTF::Seconds::microseconds const): Deleted. (WTF::Seconds::nanoseconds const): Deleted. (WTF::Seconds::minutesAs const): Deleted. (WTF::Seconds::secondsAs const): Deleted. (WTF::Seconds::millisecondsAs const): Deleted. (WTF::Seconds::microsecondsAs const): Deleted. (WTF::Seconds::nanosecondsAs const): Deleted. (WTF::Seconds::fromMinutes): Deleted. (WTF::Seconds::fromHours): Deleted. (WTF::Seconds::fromMilliseconds): Deleted. (WTF::Seconds::fromMicroseconds): Deleted. (WTF::Seconds::fromNanoseconds): Deleted. (WTF::Seconds::infinity): Deleted. (WTF::Seconds::nan): Deleted. (WTF::Seconds::operator bool const): Deleted. (WTF::Seconds::operator+ const): Deleted. (WTF::Seconds::operator- const): Deleted. (WTF::Seconds::operator* const): Deleted. (WTF::Seconds::operator/ const): Deleted. (WTF::Seconds::operator% const): Deleted. (WTF::Seconds::operator+=): Deleted. (WTF::Seconds::operator-=): Deleted. (WTF::Seconds::operator*=): Deleted. (WTF::Seconds::operator/=): Deleted. (WTF::Seconds::operator%=): Deleted. (WTF::Seconds::operator== const): Deleted. (WTF::Seconds::operator!= const): Deleted. (WTF::Seconds::operator< const): Deleted. (WTF::Seconds::operator> const): Deleted. (WTF::Seconds::operator<= const): Deleted. (WTF::Seconds::operator>= const): Deleted. (WTF::Seconds::isolatedCopy const): Deleted. (WTF::Seconds::encode const): Deleted. (WTF::Seconds::decode): Deleted. * wtf/SegmentedVector.h: (WTF::SegmentedVector::~SegmentedVector): Deleted. (WTF::SegmentedVector::size const): Deleted. (WTF::SegmentedVector::isEmpty const): Deleted. (WTF::SegmentedVector::at): Deleted. (WTF::SegmentedVector::at const): Deleted. (WTF::SegmentedVector::operator[]): Deleted. (WTF::SegmentedVector::operator[] const): Deleted. (WTF::SegmentedVector::first): Deleted. (WTF::SegmentedVector::first const): Deleted. (WTF::SegmentedVector::last): Deleted. (WTF::SegmentedVector::last const): Deleted. (WTF::SegmentedVector::takeLast): Deleted. (WTF::SegmentedVector::append): Deleted. (WTF::SegmentedVector::alloc): Deleted. (WTF::SegmentedVector::removeLast): Deleted. (WTF::SegmentedVector::grow): Deleted. (WTF::SegmentedVector::clear): Deleted. (WTF::SegmentedVector::begin): Deleted. (WTF::SegmentedVector::end): Deleted. (WTF::SegmentedVector::shrinkToFit): Deleted. (WTF::SegmentedVector::deleteAllSegments): Deleted. (WTF::SegmentedVector::segmentExistsFor): Deleted. (WTF::SegmentedVector::segmentFor): Deleted. (WTF::SegmentedVector::subscriptFor): Deleted. (WTF::SegmentedVector::ensureSegmentsFor): Deleted. (WTF::SegmentedVector::ensureSegment): Deleted. (WTF::SegmentedVector::allocateSegment): Deleted. * wtf/SetForScope.h: * wtf/SingleRootGraph.h: * wtf/SinglyLinkedList.h: * wtf/SmallPtrSet.h: * wtf/SpanningTree.h: * wtf/Spectrum.h: * wtf/StackBounds.h: * wtf/StackShot.h: * wtf/StackShotProfiler.h: * wtf/StackStats.h: * wtf/StackTrace.h: * wtf/StreamBuffer.h: * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): Deleted. (WTF::SynchronizedFixedQueue::open): Deleted. (WTF::SynchronizedFixedQueue::close): Deleted. (WTF::SynchronizedFixedQueue::isOpen): Deleted. (WTF::SynchronizedFixedQueue::enqueue): Deleted. (WTF::SynchronizedFixedQueue::dequeue): Deleted. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): Deleted. * wtf/SystemTracing.h: * wtf/ThreadGroup.h: (WTF::ThreadGroup::create): Deleted. (WTF::ThreadGroup::threads const): Deleted. (WTF::ThreadGroup::getLock): Deleted. (WTF::ThreadGroup::weakFromThis): Deleted. * wtf/ThreadSpecific.h: * wtf/ThreadingPrimitives.h: (WTF::Mutex::impl): Deleted. * wtf/TimeWithDynamicClockType.h: (WTF::TimeWithDynamicClockType::TimeWithDynamicClockType): Deleted. (WTF::TimeWithDynamicClockType::fromRawSeconds): Deleted. (WTF::TimeWithDynamicClockType::secondsSinceEpoch const): Deleted. (WTF::TimeWithDynamicClockType::clockType const): Deleted. (WTF::TimeWithDynamicClockType::withSameClockAndRawSeconds const): Deleted. (WTF::TimeWithDynamicClockType::operator bool const): Deleted. (WTF::TimeWithDynamicClockType::operator+ const): Deleted. (WTF::TimeWithDynamicClockType::operator- const): Deleted. (WTF::TimeWithDynamicClockType::operator+=): Deleted. (WTF::TimeWithDynamicClockType::operator-=): Deleted. (WTF::TimeWithDynamicClockType::operator== const): Deleted. (WTF::TimeWithDynamicClockType::operator!= const): Deleted. * wtf/TimingScope.h: * wtf/TinyLRUCache.h: * wtf/TinyPtrSet.h: * wtf/URLParser.cpp: * wtf/URLParser.h: * wtf/Unexpected.h: * wtf/Variant.h: * wtf/WTFSemaphore.h: (WTF::Semaphore::Semaphore): Deleted. (WTF::Semaphore::signal): Deleted. (WTF::Semaphore::waitUntil): Deleted. (WTF::Semaphore::waitFor): Deleted. (WTF::Semaphore::wait): Deleted. * wtf/WallTime.h: (WTF::WallTime::WallTime): Deleted. (WTF::WallTime::fromRawSeconds): Deleted. (WTF::WallTime::infinity): Deleted. (WTF::WallTime::nan): Deleted. (WTF::WallTime::secondsSinceEpoch const): Deleted. (WTF::WallTime::approximateWallTime const): Deleted. (WTF::WallTime::operator bool const): Deleted. (WTF::WallTime::operator+ const): Deleted. (WTF::WallTime::operator- const): Deleted. (WTF::WallTime::operator+=): Deleted. (WTF::WallTime::operator-=): Deleted. (WTF::WallTime::operator== const): Deleted. (WTF::WallTime::operator!= const): Deleted. (WTF::WallTime::operator< const): Deleted. (WTF::WallTime::operator> const): Deleted. (WTF::WallTime::operator<= const): Deleted. (WTF::WallTime::operator>= const): Deleted. (WTF::WallTime::isolatedCopy const): Deleted. * wtf/WeakHashSet.h: (WTF::WeakHashSet::WeakHashSetConstIterator::WeakHashSetConstIterator): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::get const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator* const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator-> const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator++): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::skipEmptyBuckets): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator== const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator!= const): Deleted. (WTF::WeakHashSet::WeakHashSet): Deleted. (WTF::WeakHashSet::begin const): Deleted. (WTF::WeakHashSet::end const): Deleted. (WTF::WeakHashSet::add): Deleted. (WTF::WeakHashSet::remove): Deleted. (WTF::WeakHashSet::contains const): Deleted. (WTF::WeakHashSet::capacity const): Deleted. (WTF::WeakHashSet::computesEmpty const): Deleted. (WTF::WeakHashSet::hasNullReferences const): Deleted. (WTF::WeakHashSet::computeSize const): Deleted. (WTF::WeakHashSet::checkConsistency const): Deleted. * wtf/WeakRandom.h: (WTF::WeakRandom::WeakRandom): Deleted. (WTF::WeakRandom::setSeed): Deleted. (WTF::WeakRandom::seed const): Deleted. (WTF::WeakRandom::get): Deleted. (WTF::WeakRandom::getUint32): Deleted. (WTF::WeakRandom::lowOffset): Deleted. (WTF::WeakRandom::highOffset): Deleted. (WTF::WeakRandom::nextState): Deleted. (WTF::WeakRandom::generate): Deleted. (WTF::WeakRandom::advance): Deleted. * wtf/WordLock.h: (WTF::WordLock::lock): Deleted. (WTF::WordLock::unlock): Deleted. (WTF::WordLock::isHeld const): Deleted. (WTF::WordLock::isLocked const): Deleted. (WTF::WordLock::isFullyReset const): Deleted. * wtf/generic/MainThreadGeneric.cpp: * wtf/glib/GMutexLocker.h: * wtf/linux/CurrentProcessMemoryStatus.h: * wtf/posix/ThreadingPOSIX.cpp: (WTF::Semaphore::Semaphore): Deleted. (WTF::Semaphore::~Semaphore): Deleted. (WTF::Semaphore::wait): Deleted. (WTF::Semaphore::post): Deleted. * wtf/text/ASCIILiteral.h: (WTF::ASCIILiteral::operator const char* const): Deleted. (WTF::ASCIILiteral::fromLiteralUnsafe): Deleted. (WTF::ASCIILiteral::null): Deleted. (WTF::ASCIILiteral::characters const): Deleted. (WTF::ASCIILiteral::ASCIILiteral): Deleted. * wtf/text/AtomString.h: (WTF::AtomString::operator=): Deleted. (WTF::AtomString::isHashTableDeletedValue const): Deleted. (WTF::AtomString::existingHash const): Deleted. (WTF::AtomString::operator const String& const): Deleted. (WTF::AtomString::string const): Deleted. (WTF::AtomString::impl const): Deleted. (WTF::AtomString::is8Bit const): Deleted. (WTF::AtomString::characters8 const): Deleted. (WTF::AtomString::characters16 const): Deleted. (WTF::AtomString::length const): Deleted. (WTF::AtomString::operator[] const): Deleted. (WTF::AtomString::contains const): Deleted. (WTF::AtomString::containsIgnoringASCIICase const): Deleted. (WTF::AtomString::find const): Deleted. (WTF::AtomString::findIgnoringASCIICase const): Deleted. (WTF::AtomString::startsWith const): Deleted. (WTF::AtomString::startsWithIgnoringASCIICase const): Deleted. (WTF::AtomString::endsWith const): Deleted. (WTF::AtomString::endsWithIgnoringASCIICase const): Deleted. (WTF::AtomString::toInt const): Deleted. (WTF::AtomString::toDouble const): Deleted. (WTF::AtomString::toFloat const): Deleted. (WTF::AtomString::percentage const): Deleted. (WTF::AtomString::isNull const): Deleted. (WTF::AtomString::isEmpty const): Deleted. (WTF::AtomString::operator NSString * const): Deleted. * wtf/text/AtomStringImpl.h: (WTF::AtomStringImpl::lookUp): Deleted. (WTF::AtomStringImpl::add): Deleted. (WTF::AtomStringImpl::addWithStringTableProvider): Deleted. * wtf/text/CString.h: (WTF::CStringBuffer::data): Deleted. (WTF::CStringBuffer::length const): Deleted. (WTF::CStringBuffer::CStringBuffer): Deleted. (WTF::CStringBuffer::mutableData): Deleted. (WTF::CString::CString): Deleted. (WTF::CString::data const): Deleted. (WTF::CString::length const): Deleted. (WTF::CString::isNull const): Deleted. (WTF::CString::buffer const): Deleted. (WTF::CString::isHashTableDeletedValue const): Deleted. * wtf/text/ExternalStringImpl.h: (WTF::ExternalStringImpl::freeExternalBuffer): Deleted. * wtf/text/LineBreakIteratorPoolICU.h: * wtf/text/NullTextBreakIterator.h: * wtf/text/OrdinalNumber.h: * wtf/text/StringBuffer.h: * wtf/text/StringBuilder.h: * wtf/text/StringConcatenateNumbers.h: * wtf/text/StringHasher.h: * wtf/text/StringImpl.h: * wtf/text/StringView.cpp: * wtf/text/StringView.h: (WTF::StringView::left const): Deleted. (WTF::StringView::right const): Deleted. (WTF::StringView::underlyingStringIsValid const): Deleted. (WTF::StringView::setUnderlyingString): Deleted. * wtf/text/SymbolImpl.h: (WTF::SymbolImpl::StaticSymbolImpl::StaticSymbolImpl): Deleted. (WTF::SymbolImpl::StaticSymbolImpl::operator SymbolImpl&): Deleted. (WTF::PrivateSymbolImpl::PrivateSymbolImpl): Deleted. (WTF::RegisteredSymbolImpl::symbolRegistry const): Deleted. (WTF::RegisteredSymbolImpl::clearSymbolRegistry): Deleted. (WTF::RegisteredSymbolImpl::RegisteredSymbolImpl): Deleted. * wtf/text/SymbolRegistry.h: * wtf/text/TextBreakIterator.h: * wtf/text/TextPosition.h: * wtf/text/TextStream.h: * wtf/text/WTFString.h: (WTF::String::swap): Deleted. (WTF::String::adopt): Deleted. (WTF::String::isNull const): Deleted. (WTF::String::isEmpty const): Deleted. (WTF::String::impl const): Deleted. (WTF::String::releaseImpl): Deleted. (WTF::String::length const): Deleted. (WTF::String::characters8 const): Deleted. (WTF::String::characters16 const): Deleted. (WTF::String::is8Bit const): Deleted. (WTF::String::sizeInBytes const): Deleted. (WTF::String::operator[] const): Deleted. (WTF::String::find const): Deleted. (WTF::String::findIgnoringASCIICase const): Deleted. (WTF::String::reverseFind const): Deleted. (WTF::String::contains const): Deleted. (WTF::String::containsIgnoringASCIICase const): Deleted. (WTF::String::startsWith const): Deleted. (WTF::String::startsWithIgnoringASCIICase const): Deleted. (WTF::String::hasInfixStartingAt const): Deleted. (WTF::String::endsWith const): Deleted. (WTF::String::endsWithIgnoringASCIICase const): Deleted. (WTF::String::hasInfixEndingAt const): Deleted. (WTF::String::append): Deleted. (WTF::String::left const): Deleted. (WTF::String::right const): Deleted. (WTF::String::createUninitialized): Deleted. (WTF::String::fromUTF8WithLatin1Fallback): Deleted. (WTF::String::isAllASCII const): Deleted. (WTF::String::isAllLatin1 const): Deleted. (WTF::String::isSpecialCharacter const): Deleted. (WTF::String::isHashTableDeletedValue const): Deleted. (WTF::String::hash const): Deleted. (WTF::String::existingHash const): Deleted. * wtf/text/cf/TextBreakIteratorCF.h: * wtf/text/icu/TextBreakIteratorICU.h: * wtf/text/icu/UTextProviderLatin1.h: * wtf/threads/BinarySemaphore.h: (WTF::BinarySemaphore::waitFor): Deleted. (WTF::BinarySemaphore::wait): Deleted. * wtf/unicode/Collator.h: * wtf/win/GDIObject.h: * wtf/win/PathWalker.h: * wtf/win/Win32Handle.h: Canonical link: https://commits.webkit.org/214396@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248546 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-12 20:57:15 +00:00
class SynchronizedFixedQueue final : public ThreadSafeRefCounted<SynchronizedFixedQueue<T, BufferSize>> {
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
public:
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
static Ref<SynchronizedFixedQueue> create()
{
return adoptRef(*new SynchronizedFixedQueue());
}
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
void open()
{
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
Locker locker { m_lock };
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
if (m_open)
return;
// Restore the queue to its original state.
m_open = true;
m_queue.clear();
}
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
void close()
{
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
Locker locker { m_lock };
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
if (!m_open)
return;
// Wake all the sleeping threads up with a closing state.
m_open = false;
m_condition.notifyAll();
}
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
bool isOpen()
{
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
Locker locker { m_lock };
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
return m_open;
}
bool enqueue(const T& value)
{
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
Locker locker { m_lock };
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
// Wait for an empty place to be available in the queue.
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
m_condition.wait(m_lock, [this] {
assertIsHeld(m_lock);
return !m_open || m_queue.size() < BufferSize;
});
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
// The queue is closing, exit immediately.
if (!m_open)
return false;
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
// Add the item in the queue.
m_queue.append(value);
// Notify the other threads that an item was added to the queue.
m_condition.notifyAll();
return true;
}
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
bool dequeue(T& value)
{
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
Locker locker { m_lock };
Images may render partial frames even after loading all the encoded data https://bugs.webkit.org/show_bug.cgi?id=177406 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-23 Reviewed by Simon Fraser. Source/WebCore: Because we do not want to block the main thread waiting for the image decoding thread to terminate, we let the decoding thread finish its work even it will be thrown away. If a new decoding thread is created and the SynchronizedFixedQueue is reopened, the terminating decoding thread might have the chance to process a new frame request. After it finishes decoding it, it realize that it is terminating so it will drop the decoded frame to the floor. So the new request was not processed by the new thread and because it was processed by the terminating thread, nothing will be reported to the BitmapImage object and the renderer will not be repainted. The fix is to create a new SynchronizedFixedQueue every time a decoding thread is created. This will guarantee that the terminating thread won't have access to the new frame request and will shut down after being notified by the old SynchronizedFixedQueue that it has been closed. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): (WebCore::ImageFrameCache::requestFrameAsyncDecodingAtIndex): (WebCore::ImageFrameCache::stopAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Make it possible to create a RefPtr<SynchronizedFixedQueue>. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): (WTF::SynchronizedFixedQueue::enqueue): (WTF::SynchronizedFixedQueue::dequeue): Canonical link: https://commits.webkit.org/193723@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222427 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-23 21:05:52 +00:00
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
// Wait for an item to be added.
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
m_condition.wait(m_lock, [this] {
assertIsHeld(m_lock);
return !m_open || m_queue.size();
});
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
// The queue is closing, exit immediately.
if (!m_open)
return false;
// Get a copy from m_queue.first and then remove it.
value = m_queue.first();
m_queue.removeFirst();
// Notify the other threads that an item was removed from the queue.
m_condition.notifyAll();
return true;
}
private:
Followup (r222427): SynchronizedFixedQueue should not have a public constructor https://bugs.webkit.org/show_bug.cgi?id=177458 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-09-26 Reviewed by Tim Horton. Source/WebCore: ImageFrameCache::decodingQueue() and frameRequestQueue() should return raw references instead of Ref objects. * platform/graphics/ImageFrameCache.cpp: (WebCore::ImageFrameCache::decodingQueue): (WebCore::ImageFrameCache::frameRequestQueue): (WebCore::ImageFrameCache::startAsyncDecodingQueue): * platform/graphics/ImageFrameCache.h: Source/WTF: Since SynchronizedFixedQueue is now derived from ThreadSafeRefCounted<SynchronizedFixedQueue>, the standard way to have an instance of it is to call SynchronizedFixedQueue::create() which returns a Ref<SynchronizedFixedQueue>. Now it does not make sense to still have the constructor public. * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): Tools: Fix the definition and the creation of SynchronizedFixedQueue. * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::startProducing): (TestWebKitAPI::ToUpperConverter::startConsuming): (TestWebKitAPI::ToUpperConverter::stopProducing): (TestWebKitAPI::ToUpperConverter::stopConsuming): (TestWebKitAPI::ToUpperConverter::enqueueLower): Canonical link: https://commits.webkit.org/193822@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222530 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-09-26 22:40:51 +00:00
SynchronizedFixedQueue()
{
static_assert(!((BufferSize - 1) & BufferSize), "BufferSize must be power of 2.");
}
Drop CheckedLock / CheckedCondition aliases https://bugs.webkit.org/show_bug.cgi?id=226176 Reviewed by Kate Cheney. Drop CheckedLock / CheckedCondition aliases now that they are the default. Source/JavaScriptCore: * API/JSVirtualMachine.mm: * API/glib/JSCVirtualMachine.cpp: * assembler/PerfLog.h: * assembler/testmasm.cpp: * bytecode/StructureStubInfo.h: * bytecode/SuperSampler.cpp: * dfg/DFGCommon.cpp: * dfg/DFGCommonData.cpp: * dfg/DFGPlan.h: * dfg/DFGThreadData.h: * dfg/DFGWorklist.cpp: (JSC::DFG::Worklist::Worklist): * dfg/DFGWorklist.h: * disassembler/Disassembler.cpp: * dynbench.cpp: * heap/BlockDirectory.cpp: (JSC::BlockDirectory::parallelNotEmptyBlockSource): * heap/BlockDirectory.h: (JSC::BlockDirectory::bitvectorLock): * heap/CodeBlockSet.h: (JSC::CodeBlockSet::getLock): * heap/Heap.cpp: (JSC::Heap::Heap): * heap/Heap.h: * heap/IsoSubspacePerVM.h: * heap/MarkedSpace.h: (JSC::MarkedSpace::directoryLock): * heap/MarkingConstraintSolver.h: * heap/SlotVisitor.cpp: (JSC::SlotVisitor::donateKnownParallel): * heap/SlotVisitor.h: * inspector/remote/socket/RemoteInspectorConnectionClient.h: * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * jit/ExecutableAllocator.cpp: (JSC::ExecutableAllocator::getLock const): (JSC::dumpJITMemory): * jit/ExecutableAllocator.h: (JSC::ExecutableAllocatorBase::getLock const): * jit/JITWorklist.cpp: (JSC::JITWorklist::JITWorklist): * jit/JITWorklist.h: * jsc.cpp: * profiler/ProfilerDatabase.h: * runtime/ConcurrentJSLock.h: * runtime/DeferredWorkTimer.h: * runtime/JSLock.h: * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::FrameWalker): (JSC::CFrameWalker::CFrameWalker): (JSC::SamplingProfiler::takeSample): * runtime/SamplingProfiler.h: (JSC::SamplingProfiler::getLock): * runtime/VM.h: * runtime/VMTraps.cpp: (JSC::VMTraps::invalidateCodeBlocksOnStack): (JSC::VMTraps::VMTraps): * runtime/VMTraps.h: * tools/FunctionOverrides.h: * tools/VMInspector.cpp: (JSC::ensureIsSafeToLock): * tools/VMInspector.h: (JSC::VMInspector::getLock): * wasm/WasmCalleeRegistry.h: (JSC::Wasm::CalleeRegistry::getLock): * wasm/WasmPlan.h: * wasm/WasmStreamingCompiler.h: * wasm/WasmThunks.h: * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::Worklist): * wasm/WasmWorklist.h: Source/WebCore: * Modules/indexeddb/IDBObjectStore.h: * Modules/indexeddb/IDBTransaction.h: * Modules/indexeddb/client/IDBConnectionProxy.h: * Modules/indexeddb/server/IDBSerializationContext.cpp: * Modules/indexeddb/server/IDBServer.cpp: * Modules/mediastream/RTCDataChannel.cpp: * Modules/mediastream/RTCRtpSFrameTransformer.h: * Modules/mediastream/RTCRtpScriptTransform.h: * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h: * Modules/mediastream/libwebrtc/LibWebRTCRtpTransformBackend.h: * Modules/speech/SpeechRecognitionCaptureSourceImpl.h: * Modules/webaudio/AudioParamTimeline.h: * Modules/webaudio/MediaElementAudioSourceNode.h: * Modules/webdatabase/Database.cpp: * Modules/webdatabase/Database.h: * Modules/webdatabase/DatabaseManager.h: * Modules/webdatabase/DatabaseTask.h: * Modules/webdatabase/DatabaseThread.h: * Modules/webdatabase/DatabaseTracker.cpp: (WebCore::DatabaseTracker::openDatabaseMutex): * Modules/webdatabase/DatabaseTracker.h: * Modules/webdatabase/OriginLock.cpp: * Modules/webdatabase/SQLCallbackWrapper.h: * Modules/webdatabase/SQLTransaction.h: * Modules/webgpu/WebGPUDevice.cpp: (WebCore::WebGPUDevice::instancesLock): * Modules/webgpu/WebGPUDevice.h: * Modules/webgpu/WebGPUPipeline.cpp: (WebCore::WebGPUPipeline::instancesLock): * Modules/webgpu/WebGPUPipeline.h: * Modules/websockets/WebSocket.cpp: (WebCore::WebSocket::allActiveWebSocketsLock): * Modules/websockets/WebSocket.h: * accessibility/isolatedtree/AXIsolatedTree.cpp: * accessibility/isolatedtree/AXIsolatedTree.h: * bindings/js/JSDOMGlobalObject.h: * bridge/objc/WebScriptObject.mm: * crypto/CryptoAlgorithmRegistry.h: * dom/MessagePort.cpp: * dom/Node.cpp: * dom/ScriptExecutionContext.cpp: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::createMediaPlayer): * html/canvas/CanvasRenderingContext.cpp: (WebCore::CanvasRenderingContext::instancesLock): * html/canvas/CanvasRenderingContext.h: * html/canvas/WebGLContextGroup.cpp: (WebCore::WebGLContextGroup::objectGraphLockForAContext): * html/canvas/WebGLContextGroup.h: * html/canvas/WebGLContextObject.cpp: (WebCore::WebGLContextObject::objectGraphLockForContext): * html/canvas/WebGLContextObject.h: * html/canvas/WebGLObject.h: * html/canvas/WebGLProgram.cpp: (WebCore::WebGLProgram::instancesLock): * html/canvas/WebGLProgram.h: * html/canvas/WebGLRenderingContextBase.cpp: (WebCore::WebGLRenderingContextBase::objectGraphLock): * html/canvas/WebGLRenderingContextBase.h: * html/canvas/WebGLSharedObject.cpp: (WebCore::WebGLSharedObject::objectGraphLockForContext): * html/canvas/WebGLSharedObject.h: * inspector/agents/WebHeapAgent.cpp: * page/ResourceUsageThread.h: * page/SecurityPolicy.cpp: * page/WheelEventTestMonitor.h: * page/scrolling/ScrollingTree.h: (WebCore::ScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/ScrollingTreeLatchingController.h: * page/scrolling/ThreadedScrollingTree.h: (WebCore::ThreadedScrollingTree::WTF_RETURNS_LOCK): * page/scrolling/mac/ScrollingTreeMac.h: * platform/AbortableTaskQueue.h: * platform/GenericTaskQueue.cpp: * platform/GenericTaskQueue.h: * platform/LegacySchemeRegistry.cpp: * platform/audio/AudioDestination.h: * platform/audio/HRTFDatabaseLoader.h: * platform/audio/ReverbConvolver.cpp: (WebCore::ReverbConvolver::backgroundThreadEntry): * platform/audio/cocoa/AudioDestinationCocoa.h: * platform/audio/gstreamer/AudioSourceProviderGStreamer.h: * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: * platform/audio/mac/FFTFrameMac.cpp: * platform/encryptedmedia/CDMProxy.h: * platform/graphics/MediaPlayer.cpp: * platform/graphics/ShadowBlur.cpp: (WebCore::ScratchBuffer::lock): (WebCore::ShadowBlur::drawRectShadowWithTiling): (WebCore::ShadowBlur::drawInsetShadowWithTiling): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm: * platform/graphics/cg/IOSurfacePool.h: * platform/graphics/cg/SubimageCacheWithTimer.h: * platform/graphics/cocoa/FontCacheCoreText.cpp: * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: * platform/graphics/gstreamer/VideoSinkGStreamer.cpp: * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: * platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp: * platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp: * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): * platform/image-decoders/ScalableImageDecoder.h: * platform/ios/QuickLook.mm: * platform/ios/WebSQLiteDatabaseTrackerClient.mm: * platform/ios/wak/WebCoreThreadRun.cpp: * platform/mediarecorder/MediaRecorderPrivateMock.h: * platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h: * platform/mediastream/RealtimeMediaSource.h: * platform/mediastream/RealtimeOutgoingAudioSource.h: * platform/mediastream/RealtimeOutgoingVideoSource.h: * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: * platform/mediastream/gstreamer/RealtimeOutgoingAudioSourceLibWebRTC.h: * platform/network/cf/LoaderRunLoopCF.cpp: (WebCore::loaderRunLoop): * platform/network/cocoa/WebCoreNSURLSession.mm: * platform/network/mac/UTIUtilities.mm: * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.h: * platform/sql/SQLiteDatabase.cpp: * platform/sql/SQLiteDatabase.h: * platform/sql/SQLiteDatabaseTracker.cpp: * platform/text/TextEncodingRegistry.cpp: * storage/StorageQuotaManager.h: * workers/WorkerGlobalScope.cpp: * workers/WorkerOrWorkletScriptController.h: * workers/WorkerOrWorkletThread.cpp: (WebCore::WorkerOrWorkletThread::workerOrWorkletThreadsLock): * workers/WorkerOrWorkletThread.h: * worklets/PaintWorkletGlobalScope.h: Source/WebKit: * GPUProcess/graphics/RemoteGraphicsContextGL.cpp: (WebKit::RemoteGraphicsContextGL::paintPixelBufferToImageBuffer): * GPUProcess/webrtc/LibWebRTCCodecsProxy.h: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp: * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h: * NetworkProcess/CustomProtocols/LegacyCustomProtocolManager.h: * NetworkProcess/IndexedDB/WebIDBServer.cpp: * NetworkProcess/NetworkProcess.h: * NetworkProcess/WebStorage/StorageManagerSet.h: * NetworkProcess/cache/NetworkCacheStorage.cpp: * NetworkProcess/cocoa/LaunchServicesDatabaseObserver.h: * NetworkProcess/glib/DNSCache.h: * Platform/IPC/Connection.cpp: * Platform/IPC/Connection.h: * Platform/IPC/StreamConnectionWorkQueue.h: * Platform/IPC/StreamServerConnection.h: * Shared/BlockingResponseMap.h: * Shared/Cocoa/XPCEndpointClient.h: * Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h: * Shared/mac/MediaFormatReader/MediaFormatReader.h: * Shared/mac/MediaFormatReader/MediaSampleCursor.h: * Shared/mac/MediaFormatReader/MediaTrackReader.h: * UIProcess/API/glib/IconDatabase.h: * UIProcess/WebURLSchemeTask.h: * UIProcess/mac/DisplayLink.h: * UIProcess/mac/WKPrintingView.mm: (-[WKPrintingView knowsPageRange:]): * WebProcess/GPU/graphics/RemoteImageBufferProxy.h: * WebProcess/GPU/webrtc/LibWebRTCCodecs.h: * WebProcess/Network/WebSocketStream.cpp: * WebProcess/Plugins/PluginProcessConnectionManager.h: * WebProcess/WebPage/EventDispatcher.h: * WebProcess/WebPage/ViewUpdateDispatcher.h: Source/WebKitLegacy: * Storage/StorageAreaSync.h: Source/WebKitLegacy/mac: * DOM/DOMInternal.mm: Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/Assertions.cpp: * wtf/AutomaticThread.cpp: (WTF::AutomaticThreadCondition::wait): (WTF::AutomaticThreadCondition::waitFor): (WTF::AutomaticThread::AutomaticThread): * wtf/AutomaticThread.h: * wtf/CMakeLists.txt: * wtf/CheckedCondition.h: Removed. * wtf/CheckedLock.h: Removed. * wtf/Condition.h: * wtf/CrossThreadQueue.h: * wtf/CrossThreadTaskHandler.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/FastMalloc.cpp: * wtf/Forward.h: * wtf/Language.cpp: * wtf/Lock.cpp: (WTF::UncheckedLock::lockSlow): (WTF::UncheckedLock::unlockSlow): (WTF::UncheckedLock::unlockFairlySlow): (WTF::UncheckedLock::safepointSlow): * wtf/Lock.h: (WTF::WTF_ASSERTS_ACQUIRED_LOCK): * wtf/Logger.cpp: * wtf/Logger.h: (WTF::Logger::WTF_RETURNS_LOCK): * wtf/MessageQueue.h: * wtf/MetaAllocator.cpp: (WTF::MetaAllocator::release): (WTF::MetaAllocator::MetaAllocator): (WTF::MetaAllocator::allocate): (WTF::MetaAllocator::currentStatistics): * wtf/MetaAllocator.h: * wtf/OSLogPrintStream.h: * wtf/ParallelHelperPool.cpp: (WTF::ParallelHelperPool::ParallelHelperPool): * wtf/ParallelHelperPool.h: * wtf/ParallelJobsGeneric.h: * wtf/ParallelVectorIterator.h: * wtf/ReadWriteLock.h: * wtf/RecursiveLockAdapter.h: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsLock): * wtf/Threading.h: * wtf/TimingScope.cpp: * wtf/URL.cpp: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/WorkerPool.cpp: (WTF::WorkerPool::WorkerPool): * wtf/WorkerPool.h: * wtf/cf/LanguageCF.cpp: * wtf/text/AtomStringImpl.cpp: (WTF::AtomStringTableLocker::AtomStringTableLocker): * wtf/text/StringView.cpp: * wtf/threads/BinarySemaphore.h: * wtf/unicode/icu/CollatorICU.cpp: Tools: * TestWebKitAPI/CMakeLists.txt: * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/CheckedConditionTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/CheckedLockTest.cpp: Removed. * TestWebKitAPI/Tests/WTF/Condition.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/Lock.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/MetaAllocator.cpp: * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp: (WTR::AXThread::createThreadIfNeeded): Canonical link: https://commits.webkit.org/238085@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277958 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-24 18:29:01 +00:00
Lock m_lock;
Condition m_condition;
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
Use CheckedCondition in more places https://bugs.webkit.org/show_bug.cgi?id=226113 Reviewed by Darin Adler. Use CheckedCondition in more places to benefit from Clang Thread Safety Analysis. Source/WebCore: * Modules/webdatabase/DatabaseTask.cpp: (WebCore::DatabaseTaskSynchronizer::waitForTaskCompletion): (WebCore::DatabaseTaskSynchronizer::taskCompleted): * Modules/webdatabase/DatabaseTask.h: (WebCore::DatabaseTaskSynchronizer::WTF_GUARDED_BY_LOCK): * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: (webKitWebAudioSrcRenderAndPushFrames): (webKitWebAudioSrcRenderIteration): (webKitWebAudioSrcChangeState): * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp: (WebCore::ImageDecoderGStreamer::setHasEOS): (WebCore::ImageDecoderGStreamer::notifySample): (WebCore::ImageDecoderGStreamer::InnerDecoder::handleMessage): (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline): (WebCore::ImageDecoderGStreamer::pushEncodedData): * platform/graphics/gstreamer/ImageDecoderGStreamer.h: * platform/graphics/gstreamer/MainThreadNotifier.h: * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamer::repaint): (WebCore::MediaPlayerPrivateGStreamer::triggerRepaint): (WebCore::MediaPlayerPrivateGStreamer::cancelRepaint): (WebCore::MediaPlayerPrivateGStreamer::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateGStreamer::waitForCDMAttachment): (WebCore::MediaPlayerPrivateGStreamer::cdmInstanceAttached): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: (WebCore::MediaPlayerPrivateGStreamer::WTF_GUARDED_BY_LOCK): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): * platform/graphics/nicosia/NicosiaImageBufferPipe.cpp: (Nicosia::NicosiaImageBufferPipeSource::handle): * platform/graphics/nicosia/texmap/NicosiaGCGLLayer.cpp: (Nicosia::GCGLLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::~TextureMapperPlatformLayerProxy): (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): (WebCore::TextureMapperPlatformLayerProxy::invalidate): (WebCore::TextureMapperPlatformLayerProxy::releaseUnusedBuffersTimerFired): (WebCore::TextureMapperPlatformLayerProxy::swapBuffer): (WebCore::TextureMapperPlatformLayerProxy::dropCurrentBufferWhilePreservingTexture): (WebCore::TextureMapperPlatformLayerProxy::scheduleUpdateOnCompositorThread): (WebCore::TextureMapperPlatformLayerProxy::compositorThreadUpdateTimerFired): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.h: (WebCore::TextureMapperPlatformLayerProxy::WTF_RETURNS_LOCK): (WebCore::TextureMapperPlatformLayerProxy::WTF_GUARDED_BY_LOCK): Source/WTF: * wtf/RunLoop.h: * wtf/SynchronizedFixedQueue.h: * wtf/WTFSemaphore.h: * wtf/WorkQueue.cpp: (WTF::WorkQueue::concurrentApply): * wtf/generic/RunLoopGeneric.cpp: (WTF::RunLoop::~RunLoop): (WTF::RunLoop::populateTasks): (WTF::RunLoop::runImpl): (WTF::RunLoop::stop): (WTF::RunLoop::wakeUpWithLock): (WTF::RunLoop::wakeUp): (WTF::RunLoop::schedule): (WTF::RunLoop::scheduleAndWakeUpWithLock): (WTF::RunLoop::TimerBase::~TimerBase): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): * wtf/win/RunLoopWin.cpp: (WTF::RunLoop::TimerBase::timerFired): (WTF::RunLoop::TimerBase::start): (WTF::RunLoop::TimerBase::stop): (WTF::RunLoop::TimerBase::isActive const): (WTF::RunLoop::TimerBase::secondsUntilFire const): Canonical link: https://commits.webkit.org/238037@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@277904 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-05-22 01:53:38 +00:00
bool m_open WTF_GUARDED_BY_LOCK(m_lock) { true };
Deque<T, BufferSize> m_queue WTF_GUARDED_BY_LOCK(m_lock);
Add SynchronizedFixedQueue class https://bugs.webkit.org/show_bug.cgi?id=162478 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-10-11 Reviewed by Geoffrey Garen. Source/WTF: This class represents a simple producer/consumer worker. It facilitates synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses a single lock and a single condition to synchronize all its members among the working threads. This means a single thread is active at any time and and the other threads are blocked waiting for the lock to be released. Or they are sleeping waiting for the condition to be satisfied. * WTF.xcodeproj/project.pbxproj: * wtf/SynchronizedFixedQueue.h: Added. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state. (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state. (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items? (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue. (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue. Tools: Add a new test for SynchronizedFixedQueue. The test defines a new class called ToUpperConverter which converts strings from lower case to upper case. It creates two threads : (1) produce thread and (2) consume thread. Here is what each thread does: 1. Main threads: Enqueues lower case strings into m_lowerQueue. 2. Produce thread: Dequeues lower case strings from m_lowerQueue and enqueue their upper case strings in the m_upperQueue. 3. Consume thread: Dequeues upper case strings from m_upperQueue. * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: * TestWebKitAPI/Tests/WTF/SynchronizedFixedQueue.cpp: Added. (TestWebKitAPI::textItem): A helper function which returns a lower case string given an index. (TestWebKitAPI::toUpper): A helper function which Returns the upper case of a string. (TestWebKitAPI::ToUpperConverter::ToUpperConverter): (TestWebKitAPI::ToUpperConverter::produceQueue): Returns a workQueue for the produce thread. (TestWebKitAPI::ToUpperConverter::consumeQueue): Returns a workQueue for the consume thread. (TestWebKitAPI::ToUpperConverter::startProducing): Creates a thread for the producer. (TestWebKitAPI::ToUpperConverter::startConsuming): Creates a thread for the consumer. (TestWebKitAPI::ToUpperConverter::start): Starts both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::stopProducing): Terminates the producer thread. (TestWebKitAPI::ToUpperConverter::stopConsuming): Terminates the consumer thread. (TestWebKitAPI::ToUpperConverter::stop): Terminates both the producer and the consumer threads. (TestWebKitAPI::ToUpperConverter::enqueueLower): Adds a lower case string to the m_lowerQueue on the main thread. (TestWebKitAPI::ToUpperConverter::isProducing): Returns whether the producing thread is active. (TestWebKitAPI::ToUpperConverter::isConsuming): Returns whether the consuming thread is active. (TestWebKitAPI::ToUpperConverter::produceCount): Returns the number of produced elements. (TestWebKitAPI::ToUpperConverter::consumeCount): Returns the number of consumed elements. (TestWebKitAPI::TEST): Canonical link: https://commits.webkit.org/181123@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-10-11 19:35:36 +00:00
};
}
using WTF::SynchronizedFixedQueue;