From ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 24 Feb 2012 16:36:50 +0100 Subject: Imported WebKit commit bb52bf3c0119e8a128cd93afe5572413a8617de9 (http://svn.webkit.org/repository/webkit/trunk@108790) --- Source/JavaScriptCore/wtf/Threading.cpp | 56 ++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 5 deletions(-) (limited to 'Source/JavaScriptCore/wtf/Threading.cpp') diff --git a/Source/JavaScriptCore/wtf/Threading.cpp b/Source/JavaScriptCore/wtf/Threading.cpp index d8dbbae4f..8d658e934 100644 --- a/Source/JavaScriptCore/wtf/Threading.cpp +++ b/Source/JavaScriptCore/wtf/Threading.cpp @@ -25,6 +25,8 @@ #include "config.h" #include "Threading.h" +#include +#include #include @@ -47,7 +49,7 @@ public: Mutex creationMutex; }; -static void* threadEntryPoint(void* contextData) +static void threadEntryPoint(void* contextData) { NewThreadContext* context = reinterpret_cast(contextData); @@ -64,7 +66,7 @@ static void* threadEntryPoint(void* contextData) void* data = context->data; delete context; - return entryPoint(data); + entryPoint(data); } ThreadIdentifier createThread(ThreadFunction entryPoint, void* data, const char* name) @@ -86,14 +88,58 @@ ThreadIdentifier createThread(ThreadFunction entryPoint, void* data, const char* #if PLATFORM(MAC) || PLATFORM(WIN) +// For ABI compatibility with Safari on Mac / Windows: Safari uses the private +// createThread() and waitForThreadCompletion() functions directly and we need +// to keep the old ABI compatibility until it's been rebuilt. + +typedef void* (*ThreadFunctionWithReturnValue)(void* argument); + +WTF_EXPORT_PRIVATE ThreadIdentifier createThread(ThreadFunctionWithReturnValue entryPoint, void* data, const char* name); + +struct ThreadFunctionWithReturnValueInvocation { + ThreadFunctionWithReturnValueInvocation(ThreadFunctionWithReturnValue function, void* data) + : function(function) + , data(data) + { + } + + ThreadFunctionWithReturnValue function; + void* data; +}; + +static void compatEntryPoint(void* param) +{ + // Balanced by .leakPtr() in createThread. + OwnPtr invocation = adoptPtr(static_cast(param)); + invocation->function(invocation->data); +} + +ThreadIdentifier createThread(ThreadFunctionWithReturnValue entryPoint, void* data, const char* name) +{ + OwnPtr invocation = adoptPtr(new ThreadFunctionWithReturnValueInvocation(entryPoint, data)); + + // Balanced by adoptPtr() in compatEntryPoint. + return createThread(compatEntryPoint, invocation.leakPtr(), name); +} + +WTF_EXPORT_PRIVATE int waitForThreadCompletion(ThreadIdentifier, void**); + +int waitForThreadCompletion(ThreadIdentifier threadID, void**) +{ + return waitForThreadCompletion(threadID); +} + // This function is deprecated but needs to be kept around for backward // compatibility. Use the 3-argument version of createThread above. -WTF_EXPORT_PRIVATE ThreadIdentifier createThread(ThreadFunction entryPoint, void* data); +WTF_EXPORT_PRIVATE ThreadIdentifier createThread(ThreadFunctionWithReturnValue entryPoint, void* data); -ThreadIdentifier createThread(ThreadFunction entryPoint, void* data) +ThreadIdentifier createThread(ThreadFunctionWithReturnValue entryPoint, void* data) { - return createThread(entryPoint, data, 0); + OwnPtr invocation = adoptPtr(new ThreadFunctionWithReturnValueInvocation(entryPoint, data)); + + // Balanced by adoptPtr() in compatEntryPoint. + return createThread(compatEntryPoint, invocation.leakPtr(), 0); } #endif -- cgit v1.2.1