Ignore:
Timestamp:
Apr 26, 2010, 3:38:55 PM (15 years ago)
Author:
[email protected]
Message:

Fix for https://bugs.webkit.org/show_bug.cgi?id=38097
Disentangle initializing the main thread from initializing threading

Reviewed by Maciej Stachowiak.

JavaScriptCore:

This is the first step in getting rid of the WEB_THREAD #define and
paving the way to allowing mac both WebKit and WebKit2 to use the same
WebCore.

  • JavaScriptCore.exp: Export initializeMainThread and initializeMainThreadToProcessMainThread.
  • JavaScriptCore.xcodeproj/project.pbxproj: Sort files.
  • wtf/MainThread.cpp:

(WTF::mainThreadInitializationMutex):
(WTF::mainThreadFunctionQueueMutex):
(WTF::initializeMainThread):
(WTF::deprecatedInitializeMainThread):

  • wtf/MainThread.h:

Added Mac only initializeMainThreadToProcessMainThread which sets up callOnMainThread
and isMainThead calls to assume that WebCore's main thread is also the
process's main thread. Since it is possible that both initializeMainThread
and initializeMainThreadToProcessMainThread could be called, the first one called
wins (either will work).

  • wtf/Threading.h: Moved to top of file.
  • wtf/ThreadingPthreads.cpp:

(WTF::initializeThreading): Remove call to initializeMainThread.

  • wtf/ThreadingWin.cpp:

(WTF::initializeThreading): Ditto.

  • wtf/gtk/ThreadingGtk.cpp:

(WTF::initializeThreading): Ditto.

  • wtf/mac/MainThreadMac.mm:

(WTF::initializeMainThreadPlatform):
(WTF::initializeMainThreadToProcessMainThread):
(WTF::scheduleDispatchFunctionsOnMainThread):
(WTF::isMainThread):
Add runtime switch between the old behavior of using the system's main
thread and a stored pointer to the main thread. Tiger always uses the
system's main thread.

  • wtf/qt/ThreadingQt.cpp:

(WTF::initializeThreading): Remove call to initializeMainThread.

  • wtf/win/MainThreadWin.cpp:

(WTF::initializeMainThreadPlatform): Add call to initializeCurrentThreadInternal
removed from initializeThreading.

WebCore:

  • WebCore.xcodeproj/project.pbxproj: Sort files.
  • accessibility/mac/AccessibilityObjectWrapper.mm: Remove unnessary

+initialize method. The AccessibilityObjectWrapper has no data members
that need to be derefed, so it does not need to be finalized on the main
thread.

  • bindings/js/ScriptController.cpp:

(WebCore::ScriptController::initializeThreading): Add call to initializeMainThread.

  • bindings/objc/WebScriptObject.mm:

(+[WebScriptObject initialize]): Add call to initializeMainThreadToProcessMainThread.

  • bindings/v8/ScriptController.cpp:

(WebCore::ScriptController::initializeThreading): Add call to initializeMainThread.

  • platform/mac/SharedBufferMac.mm:

(+[WebCoreSharedBufferData initialize]): Add call to initializeMainThreadToProcessMainThread.

WebKit/chromium:

  • src/WebKit.cpp:

(WebKit::initialize): Add call to initializeMainThread.

  • src/WebViewImpl.cpp:

(WebKit::WebViewImpl::WebViewImpl): Ditto.

WebKit/gtk:

  • webkit/webkitprivate.cpp:

(webkit_init): Add call to initializeMainThread.

WebKit/mac:

Calls initializeMainThreadToProcessMainThread since there is no way to ensure
that the initialize method will be called on the main thread.

  • Carbon/CarbonWindowAdapter.mm:

(+[CarbonWindowAdapter initialize]): Add call to initializeMainThreadToProcessMainThread.

  • History/WebBackForwardList.mm:

(+[WebBackForwardList initialize]): Ditto.

  • History/WebHistoryItem.mm:

(+[WebHistoryItem initialize]): Ditto.

  • Misc/WebElementDictionary.mm:

(+[WebElementDictionary initialize]): Ditto.

  • Misc/WebIconDatabase.mm:

(+[WebIconDatabase initialize]): Ditto.

  • Plugins/Hosted/WebHostedNetscapePluginView.mm:

(+[WebHostedNetscapePluginView initialize]): Ditto.

  • Plugins/WebBaseNetscapePluginView.mm:

(+[WebBaseNetscapePluginView initialize]): Ditto.

  • Plugins/WebBasePluginPackage.mm:

(+[WebBasePluginPackage initialize]): Ditto.

  • Plugins/WebNetscapePluginView.mm:

(+[WebNetscapePluginView initialize]): Ditto.

  • WebCoreSupport/WebEditorClient.mm:

(+[WebEditCommand initialize]): Ditto.

  • WebCoreSupport/WebFrameLoaderClient.mm:

(+[WebFramePolicyListener initialize]): Ditto.

  • WebView/WebArchive.mm:

(+[WebArchivePrivate initialize]): Ditto.

  • WebView/WebDataSource.mm:

(+[WebDataSourcePrivate initialize]): Ditto.

  • WebView/WebHTMLView.mm:

(+[WebHTMLViewPrivate initialize]): Ditto.
(+[WebHTMLView initialize]): Ditto.

  • WebView/WebResource.mm:

(+[WebResourcePrivate initialize]): Ditto.

  • WebView/WebTextIterator.mm:

(+[WebTextIteratorPrivate initialize]): Ditto.

  • WebView/WebView.mm:
  • WebView/WebViewData.mm: Ditto.

(+[WebViewPrivate initialize]): Ditto.

WebKit/qt:

  • Api/qwebpage.cpp:

(QWebPagePrivate::QWebPagePrivate): Add call to initializeMainThread.

WebKit/win:

  • WebKitClassFactory.cpp:

(WebKitClassFactory::WebKitClassFactory): Add call to initializeMainThread.

  • WebView.cpp:

(WebView::WebView): Ditto.

WebKit/wx:

  • WebView.cpp:

(wxWebView::Create): Add call to initializeMainThread.

WebKit2:

  • UIProcess/Launcher/mac/WebProcessLauncher.mm:

(WebKit::webThreadBody): Add call to initializeMainThread.

  • UIProcess/Launcher/win/WebProcessLauncher.cpp:

(WebKit::webThreadBody): Ditto.

  • WebProcess/Launching/mac/WebProcessMain.mm:

(main): Ditto.

  • WebProcess/win/WebProcessMain.cpp:

(WebKit::WebProcessMain): Ditto.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/MainThread.cpp

    r58179 r58266  
    3030#include "MainThread.h"
    3131
    32 #include "StdLibExtras.h"
    3332#include "CurrentTime.h"
    3433#include "Deque.h"
     34#include "StdLibExtras.h"
    3535#include "Threading.h"
    3636
    3737namespace WTF {
    38 
    39 #if !PLATFORM(MAC) && !PLATFORM(QT)
    40 static ThreadIdentifier mainThreadIdentifier;
    41 #endif
    4238
    4339struct FunctionWithContext {
     
    5753
    5854static bool callbacksPaused; // This global variable is only accessed from main thread.
    59 
    60 Mutex& mainThreadFunctionQueueMutex()
     55#if !PLATFORM(MAC) && !PLATFORM(QT)
     56static ThreadIdentifier mainThreadIdentifier;
     57#endif
     58
     59static Mutex& mainThreadFunctionQueueMutex()
    6160{
    6261    DEFINE_STATIC_LOCAL(Mutex, staticMutex, ());
     
    7069}
    7170
     71
     72#if !PLATFORM(MAC)
     73
    7274void initializeMainThread()
    7375{
     76    static bool initializedMainThread;
     77    if (initializedMainThread)
     78        return;
     79    initializedMainThread = true;
     80
     81#if !PLATFORM(QT)
     82    mainThreadIdentifier = currentThread();
     83#endif
     84
    7485    mainThreadFunctionQueueMutex();
    7586    initializeMainThreadPlatform();
    76 
    77 #if !PLATFORM(MAC) && !PLATFORM(QT)
    78     mainThreadIdentifier = currentThread();
    79 #endif
    80 }
     87}
     88
     89#else
     90
     91static pthread_once_t initializeMainThreadKeyOnce = PTHREAD_ONCE_INIT;
     92
     93static void initializeMainThreadOnce()
     94{
     95    mainThreadFunctionQueueMutex();
     96    initializeMainThreadPlatform();
     97}
     98
     99void initializeMainThread()
     100{
     101    pthread_once(&initializeMainThreadKeyOnce, initializeMainThreadOnce);
     102}
     103
     104static void initializeMainThreadToProcessMainThreadOnce()
     105{
     106    mainThreadFunctionQueueMutex();
     107    initializeMainThreadToProcessMainThreadPlatform();
     108}
     109
     110void initializeMainThreadToProcessMainThread()
     111{
     112    pthread_once(&initializeMainThreadKeyOnce, initializeMainThreadToProcessMainThreadOnce);
     113}
     114#endif
    81115
    82116// 0.1 sec delays in UI is approximate threshold when they become noticeable. Have a limit that's half of that.
Note: See TracChangeset for help on using the changeset viewer.