Diff
Modified: trunk/Source/WebCore/ChangeLog (161846 => 161847)
--- trunk/Source/WebCore/ChangeLog 2014-01-13 01:44:13 UTC (rev 161846)
+++ trunk/Source/WebCore/ChangeLog 2014-01-13 02:01:51 UTC (rev 161847)
@@ -1,5 +1,24 @@
2014-01-12 Anders Carlsson <[email protected]>
+ Remove all uses of AtomicallyInitializedStatic from WebCore
+ https://bugs.webkit.org/show_bug.cgi?id=126861
+
+ Reviewed by Darin Adler.
+
+ * Modules/indexeddb/IDBPendingTransactionMonitor.cpp:
+ (WebCore::transactions):
+ * fileapi/ThreadableBlobRegistry.cpp:
+ (WebCore::originMap):
+ * platform/text/TextEncodingRegistry.cpp:
+ (WebCore::encodingRegistryMutex):
+ (WebCore::newTextCodec):
+ (WebCore::atomicCanonicalTextEncodingName):
+ (WebCore::dumpTextEncodingNameMap):
+ * workers/DefaultSharedWorkerRepository.cpp:
+ (WebCore::DefaultSharedWorkerRepository::instance):
+
+2014-01-12 Anders Carlsson <[email protected]>
+
Use an std::atomic<uint32_t> when computing IDBDatabase transaction IDs
https://bugs.webkit.org/show_bug.cgi?id=126853
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBPendingTransactionMonitor.cpp (161846 => 161847)
--- trunk/Source/WebCore/Modules/indexeddb/IDBPendingTransactionMonitor.cpp 2014-01-13 01:44:13 UTC (rev 161846)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBPendingTransactionMonitor.cpp 2014-01-13 02:01:51 UTC (rev 161847)
@@ -26,6 +26,7 @@
#include "config.h"
#include "IDBPendingTransactionMonitor.h"
#include "IDBTransaction.h"
+#include <mutex>
#include <wtf/ThreadSpecific.h>
using WTF::ThreadSpecific;
@@ -35,11 +36,17 @@
namespace WebCore {
typedef Vector<RefPtr<IDBTransaction>> TransactionList;
+
static ThreadSpecific<TransactionList>& transactions()
{
// FIXME: Move the Vector to ScriptExecutionContext to avoid dealing with
// thread-local storage.
- AtomicallyInitializedStatic(ThreadSpecific<TransactionList>*, transactions = new ThreadSpecific<TransactionList>);
+ static std::once_flag onceFlag;
+ static ThreadSpecific<TransactionList>* transactions;
+ std::call_once(onceFlag, []{
+ transactions = new ThreadSpecific<TransactionList>;
+ });
+
return *transactions;
}
Modified: trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp (161846 => 161847)
--- trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp 2014-01-13 01:44:13 UTC (rev 161846)
+++ trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp 2014-01-13 02:01:51 UTC (rev 161847)
@@ -35,6 +35,7 @@
#include "BlobRegistry.h"
#include "BlobURL.h"
#include "SecurityOrigin.h"
+#include <mutex>
#include <wtf/HashMap.h>
#include <wtf/MainThread.h>
#include <wtf/RefPtr.h>
@@ -74,9 +75,15 @@
#if ENABLE(BLOB)
typedef HashMap<String, RefPtr<SecurityOrigin>> BlobUrlOriginMap;
+
static ThreadSpecific<BlobUrlOriginMap>& originMap()
{
- AtomicallyInitializedStatic(ThreadSpecific<BlobUrlOriginMap>*, map = new ThreadSpecific<BlobUrlOriginMap>);
+ static std::once_flag onceFlag;
+ static ThreadSpecific<BlobUrlOriginMap>* map;
+ std::call_once(onceFlag, []{
+ map = new ThreadSpecific<BlobUrlOriginMap>;
+ });
+
return *map;
}
Modified: trunk/Source/WebCore/platform/text/TextEncodingRegistry.cpp (161846 => 161847)
--- trunk/Source/WebCore/platform/text/TextEncodingRegistry.cpp 2014-01-13 01:44:13 UTC (rev 161846)
+++ trunk/Source/WebCore/platform/text/TextEncodingRegistry.cpp 2014-01-13 02:01:51 UTC (rev 161847)
@@ -32,10 +32,12 @@
#include "TextCodecUTF16.h"
#include "TextCodecUTF8.h"
#include "TextEncoding.h"
+#include <mutex>
#include <wtf/ASCIICType.h>
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/MainThread.h>
+#include <wtf/NeverDestroyed.h>
#include <wtf/StdLibExtras.h>
#include <wtf/StringExtras.h>
@@ -105,12 +107,12 @@
typedef HashMap<const char*, const char*, TextEncodingNameHash> TextEncodingNameMap;
typedef HashMap<const char*, TextCodecFactory> TextCodecMap;
-static Mutex& encodingRegistryMutex()
+static std::mutex& encodingRegistryMutex()
{
- // We don't have to use AtomicallyInitializedStatic here because
- // this function is called on the main thread for any page before
- // it is used in worker threads.
- DEFINE_STATIC_LOCAL(Mutex, mutex, ());
+ // We don't have to construct this mutex in a thread safe way because this function
+ // is called on the main thread for any page before it is used in worker threads.
+ static NeverDestroyed<std::mutex> mutex;
+
return mutex;
}
@@ -300,7 +302,7 @@
PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding)
{
- MutexLocker lock(encodingRegistryMutex());
+ std::lock_guard<std::mutex> lock(encodingRegistryMutex());
ASSERT(textCodecMap);
TextCodecFactory factory = textCodecMap->get(encoding.name());
@@ -311,16 +313,18 @@
const char* atomicCanonicalTextEncodingName(const char* name)
{
if (!name || !name[0])
- return 0;
+ return nullptr;
+
if (!textEncodingNameMap)
buildBaseTextCodecMaps();
- MutexLocker lock(encodingRegistryMutex());
+ std::lock_guard<std::mutex> lock(encodingRegistryMutex());
if (const char* atomicName = textEncodingNameMap->get(name))
return atomicName;
if (didExtendTextCodecMaps)
- return 0;
+ return nullptr;
+
extendTextCodecMaps();
didExtendTextCodecMaps = true;
return textEncodingNameMap->get(name);
@@ -364,7 +368,7 @@
unsigned size = textEncodingNameMap->size();
fprintf(stderr, "Dumping %u entries in WebCore::textEncodingNameMap...\n", size);
- MutexLocker lock(encodingRegistryMutex());
+ std::lock_guard<std::mutex> lock(encodingRegistryMutex());
TextEncodingNameMap::const_iterator it = textEncodingNameMap->begin();
TextEncodingNameMap::const_iterator end = textEncodingNameMap->end();
Modified: trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp (161846 => 161847)
--- trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp 2014-01-13 01:44:13 UTC (rev 161846)
+++ trunk/Source/WebCore/workers/DefaultSharedWorkerRepository.cpp 2014-01-13 02:01:51 UTC (rev 161847)
@@ -56,6 +56,7 @@
#include "WorkerReportingProxy.h"
#include "WorkerScriptLoader.h"
#include "WorkerScriptLoaderClient.h"
+#include <mutex>
#include <wtf/HashSet.h>
#include <wtf/Threading.h>
#include <wtf/text/WTFString.h>
@@ -340,7 +341,12 @@
DefaultSharedWorkerRepository& DefaultSharedWorkerRepository::instance()
{
- AtomicallyInitializedStatic(DefaultSharedWorkerRepository*, instance = new DefaultSharedWorkerRepository);
+ static std::once_flag onceFlag;
+ static DefaultSharedWorkerRepository* instance;
+ std::call_once(onceFlag, []{
+ instance = new DefaultSharedWorkerRepository;
+ });
+
return *instance;
}