WebCore:
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Feb 2008 20:28:49 +0000 (20:28 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Feb 2008 20:28:49 +0000 (20:28 +0000)
        Reviewed by Geoff and Brady.

        - fix <rdar://problem/5680469> Each database worker thread takes a JSLock,
          which slows down all JavaScript execution until the thread terminates

        * bindings/js/JSCustomSQLTransactionCallback.cpp:
        (WebCore::JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback):
        Explicitly gcProtect, since we aren't using ProtectedPtr any more.
        (WebCore::unprotectOnMainThread): Added.
        (WebCore::JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback):
        Use unprotectOnMainThread rather than doing a gcUnprotect here.
        * bindings/js/JSCustomSQLTransactionCallback.h: Changed m_callback from
        a ProtectedPtr to a plain old JSObject*; we gcProtect by hand now.

        * loader/icon/IconDatabase.cpp:
        (WebCore::IconDatabase::notifyPendingLoadDecisionsOnMainThread):
        Renamed. Changed to takea a void* with the icon database pointer.
        (WebCore::IconDatabase::notifyPendingLoadDecisions): Renamed.
        (WebCore::IconDatabase::performURLImport): Updated name, and pass the
        icon database pointer in.
        * loader/icon/IconDatabase.h: Renamed and added void* parameter.

        * platform/Threading.h: Changed callOnMainThread to take a function with a
        single parameter rather than a function with no parameters. Added a typedef.

        * platform/gtk/ThreadingGtk.cpp:
        (WebCore::callFunctionOnMainThread): Changed to use a structure with both
        a function pointer and a context pointer, and delete it after calling.
        (WebCore::callOnMainThread): Changed to create the structure with both
        the function and context pointer.

        * platform/mac/Threading.mm:
        (-[WebCoreFunctionWrapper initWithFunction:context:]): Added context.
        (-[WebCoreFunctionWrapper invoke]): Updated to do both function and context.
        Renamed from _call.
        (WebCore::callOnMainThread): Updated to take both function and context.

        * platform/qt/ThreadingQt.cpp:
        (WebCore::PerformFunctionEvent::PerformFunctionEvent): Added context.
        (WebCore::PerformFunctionEvent::invoke): Added. Calls function with context pointer.
        (WebCore::MainThreadInvoker::event): Changed to call invoke.
        (WebCore::callOnMainThread): Updated to take both function and context.

        * platform/win/ThreadingWin.cpp: Added FunctionWithContext.
        (WebCore::callFunctionsOnMainThread): Changed to pass call function with context.
        (WebCore::callOnMainThread): Updated to queue both function and context.

        * platform/wx/ThreadingWx.cpp:
        (WebCore::callOnMainThread): Updated to take both function and context.

        * storage/Database.cpp:
        (WebCore::Database::scheduleTransactionCallback): Pass 0 for context.
        (WebCore::Database::deliverAllPendingCallbacks): Changed to take ignored context pointer.
        * storage/Database.h: Added void* parameter to deliverAllPendingCallbacks.

        * storage/DatabaseTracker.cpp:
        (WebCore::DatabaseTracker::scheduleForNotification): Pass 0 for context.
        (WebCore::DatabaseTracker::notifyDatabasesChanged): Changed to take ignored context pointer.
        * storage/DatabaseTracker.h: Added void* parameter to notifyDatabasesChanged.

WebKit/win:

        - fix <rdar://problem/5680469> Each database worker thread takes a JSLock,
          which slows down all JavaScript execution until the thread terminates

        * WebIconDatabase.cpp:
        (WebIconDatabase::scheduleNotificationDelivery): Updated for new callOnMainThread.
        (WebIconDatabase::deliverNotifications): Ditto.
        * WebIconDatabase.h: Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@29922 268f45cc-cd09-0410-ab3c-d52691b4dbfc

19 files changed:
WebCore/ChangeLog
WebCore/bindings/js/JSCustomSQLTransactionCallback.cpp
WebCore/bindings/js/JSCustomSQLTransactionCallback.h
WebCore/loader/icon/IconDatabase.cpp
WebCore/loader/icon/IconDatabase.h
WebCore/platform/Threading.h
WebCore/platform/gtk/ThreadingGtk.cpp
WebCore/platform/mac/Threading.mm
WebCore/platform/network/mac/ResourceHandleMac.mm
WebCore/platform/qt/ThreadingQt.cpp
WebCore/platform/win/ThreadingWin.cpp
WebCore/platform/wx/ThreadingWx.cpp
WebCore/storage/Database.cpp
WebCore/storage/Database.h
WebCore/storage/DatabaseTracker.cpp
WebCore/storage/DatabaseTracker.h
WebKit/win/ChangeLog
WebKit/win/WebIconDatabase.cpp
WebKit/win/WebIconDatabase.h

index 59a01b1..53c0c92 100644 (file)
@@ -1,3 +1,65 @@
+2008-02-01  Darin Adler  <darin@apple.com>
+
+        Reviewed by Geoff and Brady.
+
+        - fix <rdar://problem/5680469> Each database worker thread takes a JSLock,
+          which slows down all JavaScript execution until the thread terminates
+
+        * bindings/js/JSCustomSQLTransactionCallback.cpp:
+        (WebCore::JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback):
+        Explicitly gcProtect, since we aren't using ProtectedPtr any more.
+        (WebCore::unprotectOnMainThread): Added.
+        (WebCore::JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback):
+        Use unprotectOnMainThread rather than doing a gcUnprotect here.
+        * bindings/js/JSCustomSQLTransactionCallback.h: Changed m_callback from
+        a ProtectedPtr to a plain old JSObject*; we gcProtect by hand now.
+
+        * loader/icon/IconDatabase.cpp:
+        (WebCore::IconDatabase::notifyPendingLoadDecisionsOnMainThread):
+        Renamed. Changed to takea a void* with the icon database pointer.
+        (WebCore::IconDatabase::notifyPendingLoadDecisions): Renamed.
+        (WebCore::IconDatabase::performURLImport): Updated name, and pass the
+        icon database pointer in.
+        * loader/icon/IconDatabase.h: Renamed and added void* parameter.
+
+        * platform/Threading.h: Changed callOnMainThread to take a function with a
+        single parameter rather than a function with no parameters. Added a typedef.
+
+        * platform/gtk/ThreadingGtk.cpp:
+        (WebCore::callFunctionOnMainThread): Changed to use a structure with both
+        a function pointer and a context pointer, and delete it after calling.
+        (WebCore::callOnMainThread): Changed to create the structure with both
+        the function and context pointer.
+
+        * platform/mac/Threading.mm:
+        (-[WebCoreFunctionWrapper initWithFunction:context:]): Added context.
+        (-[WebCoreFunctionWrapper invoke]): Updated to do both function and context.
+        Renamed from _call.
+        (WebCore::callOnMainThread): Updated to take both function and context.
+
+        * platform/qt/ThreadingQt.cpp:
+        (WebCore::PerformFunctionEvent::PerformFunctionEvent): Added context.
+        (WebCore::PerformFunctionEvent::invoke): Added. Calls function with context pointer.
+        (WebCore::MainThreadInvoker::event): Changed to call invoke.
+        (WebCore::callOnMainThread): Updated to take both function and context.
+
+        * platform/win/ThreadingWin.cpp: Added FunctionWithContext.
+        (WebCore::callFunctionsOnMainThread): Changed to pass call function with context.
+        (WebCore::callOnMainThread): Updated to queue both function and context.
+
+        * platform/wx/ThreadingWx.cpp:
+        (WebCore::callOnMainThread): Updated to take both function and context.
+
+        * storage/Database.cpp:
+        (WebCore::Database::scheduleTransactionCallback): Pass 0 for context.
+        (WebCore::Database::deliverAllPendingCallbacks): Changed to take ignored context pointer.
+        * storage/Database.h: Added void* parameter to deliverAllPendingCallbacks.
+
+        * storage/DatabaseTracker.cpp:
+        (WebCore::DatabaseTracker::scheduleForNotification): Pass 0 for context.
+        (WebCore::DatabaseTracker::notifyDatabasesChanged): Changed to take ignored context pointer.
+        * storage/DatabaseTracker.h: Added void* parameter to notifyDatabasesChanged.
+
 2008-02-01  Jon Honeycutt  <jhoneycutt@apple.com>
 
         Rubber-stamped by Ollie.
index 87efb3c..a9a2fe4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -41,7 +41,8 @@ namespace WebCore {
 using namespace KJS;
     
 #ifndef NDEBUG
-WTFLogChannel LogWebCoreSQLLeaks =  { 0x00000000, "", WTFLogChannelOn };
+
+WTFLogChannel LogWebCoreSQLLeaks = { 0x00000000, "", WTFLogChannelOn };
 
 struct JSCustomSQLTransactionCallbackCounter { 
     static int count; 
@@ -51,21 +52,34 @@ struct JSCustomSQLTransactionCallbackCounter {
             LOG(WebCoreSQLLeaks, "LEAK: %d JSCustomSQLTransactionCallback\n", count);
     }
 };
+
 int JSCustomSQLTransactionCallbackCounter::count = 0;
 static JSCustomSQLTransactionCallbackCounter counter;
+
 #endif
 
 JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback(JSObject* callback, Frame* frame)
     : m_callback(callback)
     , m_frame(frame)
 {
+    gcProtect(callback);
+
 #ifndef NDEBUG
     ++JSCustomSQLTransactionCallbackCounter::count;
 #endif
 }
-    
+
+static void unprotectOnMainThread(void* context)
+{
+    gcUnprotect(static_cast<KJS::JSObject*>(context));
+}
+
 JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback()
 {
+    // Avoid putting JavaScript into multi-thread mode unnecessarily by doing the gcUnprotect
+    // on the main thread.
+    callOnMainThread(unprotectOnMainThread, m_callback);
+
 #ifndef NDEBUG
     --JSCustomSQLTransactionCallbackCounter::count;
 #endif
index 555cb3d..662a394 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #define JSCustomSQLTransactionCallback_h
 
 #include "SQLTransactionCallback.h"
-
-#include <kjs/object.h>
-#include <kjs/protect.h>
-#include <wtf/Forward.h>
+#include <wtf/RefPtr.h>
 
 namespace KJS {
     class JSObject;
@@ -42,7 +39,6 @@ namespace KJS {
 namespace WebCore {
 
 class Frame;
-class SQLResultSet;
 
 class JSCustomSQLTransactionCallback : public SQLTransactionCallback {
 public:
@@ -50,8 +46,9 @@ public:
     virtual ~JSCustomSQLTransactionCallback();
     
     virtual void handleEvent(SQLTransaction*, bool& raisedException);
+
 private:
-    KJS::ProtectedPtr<KJS::JSObject> m_callback;
+    KJS::JSObject* m_callback;
     RefPtr<Frame> m_frame;
 };
 
index b7c63f5..bd83392 100644 (file)
@@ -767,12 +767,12 @@ IconDatabase::~IconDatabase()
     ASSERT_NOT_REACHED();
 }
 
-void IconDatabase::notifyPendingLoadDecisions()
-{    
-    iconDatabase()->notifyPendingLoadDecisionsInternal();
+void IconDatabase::notifyPendingLoadDecisionsOnMainThread(void* context)
+{
+    static_cast<IconDatabase*>(context)->notifyPendingLoadDecisions();
 }
 
-void IconDatabase::notifyPendingLoadDecisionsInternal()
+void IconDatabase::notifyPendingLoadDecisions()
 {
     ASSERT_NOT_SYNC_THREAD();
     
@@ -1299,7 +1299,7 @@ void IconDatabase::performURLImport()
     }
     
     // Notify all DocumentLoaders that were waiting for an icon load decision on the main thread
-    callOnMainThread(notifyPendingLoadDecisions);
+    callOnMainThread(notifyPendingLoadDecisionsOnMainThread, this);
 }
 
 void* IconDatabase::syncThreadMainLoop()
index 51f5dbd..ea48c16 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
  *
  * Redistribution and use in source and binary forms, with or without
@@ -110,11 +110,8 @@ private:
     friend IconDatabase* iconDatabase();
 
 #if ENABLE(ICONDATABASE)
-    // This is called on the main thread via the callOnMainThread() function which currently
-    // doesn't have any way to allow it to be an instance method, which it should be
-    static void notifyPendingLoadDecisions();
-    
-    void notifyPendingLoadDecisionsInternal();
+    static void notifyPendingLoadDecisionsOnMainThread(void*);
+    void notifyPendingLoadDecisions();
 
     void wakeSyncThread();
     void scheduleOrDeferSyncTimer();
index 77a07c8..00301b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
  *
  * Redistribution and use in source and binary forms, with or without
@@ -231,7 +231,9 @@ private:
 #endif
 };
 
-void callOnMainThread(void (*)());
+typedef void MainThreadFunction(void*);
+
+void callOnMainThread(MainThreadFunction*, void* context);
 
 void initializeThreading();
 
index dcbb227..3d5f1b0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
  *
  * Redistribution and use in source and binary forms, with or without
 
 namespace WebCore {
 
+struct FunctionWithContext {
+    MainThreadFunction* function;
+    void* context;
+};
+
 static gboolean callFunctionOnMainThread(gpointer data)
 {
-    void (*function)() = (void(*)())data;
-    function();
+    FunctionWithContext* functionWithContext = static_cast<FunctionWithContext*>(data);
+    functionWithContext->function(functionWithContext->context);
+    delete functionWithContext;
     return FALSE;
 }
 
-void callOnMainThread(void (*function)())
+void callOnMainThread(MainThreadFunction* function, void* context)
 {
     ASSERT(function);
-    g_timeout_add(0, callFunctionOnMainThread, (gpointer)function);
+    FunctionWithContext* functionWithContext = new FunctionWithContext;
+    functionWithContext->function = function;
+    functionWithContext->context = context;
+    g_timeout_add(0, callFunctionOnMainThread, functionWithContext);
 }
 
 void initializeThreading()
index 4add53b..02d39a3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #import "Threading.h"
 
 @interface WebCoreFunctionWrapper : NSObject {
-void (*_function)();
+    WebCore::MainThreadFunction* m_function;
+    void* m_context;
 }
-- (id)initWithFunction:(void(*)())function;
-- (void)_call;
+- (id)initWithFunction:(WebCore::MainThreadFunction*)function context:(void*)context;
+- (void)invoke;
 @end
 
 @implementation WebCoreFunctionWrapper
 
-- (id)initWithFunction:(void(*)())function
+- (id)initWithFunction:(WebCore::MainThreadFunction*)function context:(void*)context;
 {
     [super init];
-    _function = function;
+    m_function = function;
+    m_context = context;
     return self;
 }
 
-- (void)_call
+- (void)invoke
 {
-    _function();
+    m_function(m_context);
 }
 
 @end // implementation WebCoreFunctionWrapper
 
 namespace WebCore {
 
-void callOnMainThread(void (*functionToPerform)())
+void callOnMainThread(MainThreadFunction* function, void* context)
 {
-    if (!functionToPerform)
-        return;
-        
-    WebCoreFunctionWrapper *functionWrapper = [[WebCoreFunctionWrapper alloc] initWithFunction:functionToPerform];
-    [functionWrapper performSelectorOnMainThread:@selector(_call) withObject:nil waitUntilDone:NO];
-    [functionWrapper release];
+    WebCoreFunctionWrapper *wrapper = [[WebCoreFunctionWrapper alloc] initWithFunction:function context:context];
+    [wrapper performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:NO];
+    [wrapper release];
 }
 
 } // namespace WebCore
index dc83473..ad6051a 100644 (file)
@@ -213,7 +213,11 @@ NSURLConnection *ResourceHandle::connection() const
 
 bool ResourceHandle::loadsBlocked()
 {
+#ifdef BUILDING_ON_TIGER
     return inNSURLConnectionCallback != 0;
+#else
+    return false;
+#endif
 }
 
 bool ResourceHandle::willLoadFromCache(ResourceRequest& request)
index 28cb608..e8679ed 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2007 Staikos Computing Services Inc.
  * Copyright (C) 2007 Trolltech ASA
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -37,8 +38,13 @@ class PerformFunctionEvent : public QEvent {
 public:
     static const int EventType = 723;
 
-    PerformFunctionEvent(void (*_function)());
-    void (*function)();
+    PerformFunctionEvent(MainThreadFunction*, void* context);
+
+    void invoke();
+
+private:
+    MainThreadFunction* m_function;
+    void* m_context;
 };
 
 class MainThreadInvoker : public QObject {
@@ -50,10 +56,17 @@ protected:
     bool event(QEvent*);
 };
 
-PerformFunctionEvent::PerformFunctionEvent(void (*_function)())
+PerformFunctionEvent::PerformFunctionEvent(MainThreadFunction* function, void* context)
     : QEvent(static_cast<QEvent::Type>(EventType))
-    , function(_function)
-{}
+    , m_function(function)
+    , m_context(context)
+{
+}
+
+void PerformFunctionEvent::invoke()
+{
+    m_function(m_context);
+}
 
 MainThreadInvoker::MainThreadInvoker()
 {
@@ -63,7 +76,7 @@ MainThreadInvoker::MainThreadInvoker()
 bool MainThreadInvoker::event(QEvent* event)
 {
     if (event->type() == PerformFunctionEvent::EventType)
-        static_cast<PerformFunctionEvent*>(event)->function();
+        static_cast<PerformFunctionEvent*>(event)->invoke();
 
     return QObject::event(event);
 }
@@ -71,11 +84,9 @@ bool MainThreadInvoker::event(QEvent* event)
 Q_GLOBAL_STATIC(MainThreadInvoker, webkit_main_thread_invoker)
 
 
-void callOnMainThread(void (*functionToPerform)()) {
-    if (!functionToPerform)
-        return;
-
-    QCoreApplication::postEvent(webkit_main_thread_invoker(), new PerformFunctionEvent(functionToPerform));
+void callOnMainThread(MainThreadFunction* function, void* contexxt)
+{
+    QCoreApplication::postEvent(webkit_main_thread_invoker(), new PerformFunctionEvent(function, context));
 }
 
 }
index 5bfdefe..0da3d17 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 namespace WebCore {
 
-typedef Vector<void(*)()> FunctionQueue;
+struct FunctionWithContext {
+    MainThreadFunction* function;
+    void* context;
+    FunctionWithContext(MainThreadFunction* f = 0, void* c = 0) : function(f), context(c) { }
+};
+
+typedef Vector<FunctionWithContext> FunctionQueue;
 
 static HWND threadingWindowHandle = 0;
 static UINT threadingFiredMessage = 0;
@@ -147,7 +153,7 @@ static void callFunctionsOnMainThread()
 
     LOG(Threading, "Calling %u functions on the main thread", queueCopy.size());
     for (unsigned i = 0; i < queueCopy.size(); ++i)
-        queueCopy[i]();
+        queueCopy[i].function(queueCopy[i].context);
 }
 
 LRESULT CALLBACK ThreadingWindowWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -179,7 +185,7 @@ void initializeThreading()
     threadingFiredMessage = RegisterWindowMessage(L"com.apple.WebKit.MainThreadFired");
 }
     
-void callOnMainThread(void(*function)())
+void callOnMainThread(MainThreadFunction* function, void* context)
 {
     ASSERT(function);
     ASSERT(threadingWindowHandle);
@@ -189,7 +195,7 @@ void callOnMainThread(void(*function)())
 
     {
         MutexLocker locker(functionQueueMutex());
-        functionQueue().append(function);
+        functionQueue().append(FunctionWithContext(function, context));
     }
 
     PostMessage(threadingWindowHandle, threadingFiredMessage, 0, 0);
index b95ec99..0a68db9 100644 (file)
@@ -31,7 +31,8 @@
 
 namespace WebCore {
 
-void callOnMainThread(void (*function)()) {
+void callOnMainThread(MainThreadFunction*, void*)
+{
     notImplemented();
 }
 
index d0e4102..2458485 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -499,7 +499,7 @@ void Database::scheduleTransactionCallback(SQLTransaction* transaction)
     globalCallbackSet().add(this);
 
     if (!s_globalCallbackScheduled) {
-        callOnMainThread(deliverAllPendingCallbacks);
+        callOnMainThread(deliverAllPendingCallbacks, 0);
         s_globalCallbackScheduled = true;
     }
 }
@@ -539,7 +539,7 @@ String Database::version() const
     return guidToVersionMap().get(m_guid).copy();
 }
     
-void Database::deliverAllPendingCallbacks()
+void Database::deliverAllPendingCallbacks(void*)
 {
     Vector<RefPtr<Database> > databases;
     {
index 64cd4e5..4290fb1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -119,7 +119,7 @@ private:
     void sizeTimerFired(Timer<Database>*);
     OwnPtr<Timer<Database> > m_sizeTimer;
 
-    static void deliverAllPendingCallbacks();
+    static void deliverAllPendingCallbacks(void*);
     void deliverPendingCallback();
 
     Document* m_document;
index fa2ea2e..eece291 100644 (file)
@@ -684,12 +684,12 @@ void DatabaseTracker::scheduleForNotification()
     ASSERT(!notificationMutex().tryLock());
 
     if (!notificationScheduled) {
-        callOnMainThread(DatabaseTracker::notifyDatabasesChanged);
+        callOnMainThread(DatabaseTracker::notifyDatabasesChanged, 0);
         notificationScheduled = true;
     }
 }
 
-void DatabaseTracker::notifyDatabasesChanged()
+void DatabaseTracker::notifyDatabasesChanged(void*)
 {
     // Note that if DatabaseTracker ever becomes non-singleton, we'll have to amend this notification
     // mechanism to include which tracker the notification goes out on as well.
index 3ecceb6..50e0b0d 100644 (file)
@@ -108,7 +108,7 @@ private:
 #endif
 
     static void scheduleForNotification();
-    static void notifyDatabasesChanged();
+    static void notifyDatabasesChanged(void*);
 };
 
 } // namespace WebCore
index fa7a722..d8003cb 100644 (file)
@@ -1,3 +1,13 @@
+2008-02-01  Darin Adler  <darin@apple.com>
+
+        - fix <rdar://problem/5680469> Each database worker thread takes a JSLock,
+          which slows down all JavaScript execution until the thread terminates
+
+        * WebIconDatabase.cpp:
+        (WebIconDatabase::scheduleNotificationDelivery): Updated for new callOnMainThread.
+        (WebIconDatabase::deliverNotifications): Ditto.
+        * WebIconDatabase.h: Ditto.
+
 2008-01-31  Adam Roben  <aroben@apple.com>
 
         Fix <rdar://5713172> Focus lost from Gmail message body after toggling
index 0e2acbe..c778993 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -294,7 +294,7 @@ void WebIconDatabase::scheduleNotificationDelivery()
 
     if (!m_deliveryRequested) {
         m_deliveryRequested = true;
-        callOnMainThread(WebIconDatabase::deliverNotifications);
+        callOnMainThread(deliverNotifications, 0);
     }
 }
 
@@ -337,7 +337,7 @@ static void postDidAddIconNotification(const String& pageURL, WebIconDatabase* i
     notifyCenter->postNotificationName(WebIconDatabase::iconDatabaseDidAddIconNotification(), static_cast<IWebIconDatabase*>(iconDB), userInfo.get());
 }
 
-void WebIconDatabase::deliverNotifications()
+void WebIconDatabase::deliverNotifications(void*)
 {
     ASSERT(m_sharedWebIconDatabase);
     if (!m_sharedWebIconDatabase)
index 98c830c..c722efc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -117,7 +117,7 @@ protected:
     void scheduleNotificationDelivery();
     bool m_deliveryRequested;
 
-    static void deliverNotifications();
+    static void deliverNotifications(void*);
 };
 
 #endif