[GTK] Use RunLoop::Timer in PluginInfoCache
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 1 Nov 2015 08:33:38 +0000 (08:33 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 1 Nov 2015 08:33:38 +0000 (08:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=150757

Reviewed by Darin Adler.

Use RunLoop::Timer instead of GMainLoopSource to save the cache
contents in an idle. Also remove the mutex, since RunLoop::Timer
is thread safe and saveToFile() is private and only called by the
main thread loop. Also removed the code to save the file in the
destructor since PluginInfoCache is a singleton and never
destroyed. It's very unlikely that the program finished before the
cache is saved, but even if that happens it would be harmless, the
cache will be saved at some point the next time.

* UIProcess/Plugins/gtk/PluginInfoCache.cpp:
(WebKit::PluginInfoCache::PluginInfoCache):
(WebKit::PluginInfoCache::updatePluginInfo):
(WebKit::PluginInfoCache::~PluginInfoCache):
(WebKit::PluginInfoCache::saveToFile):
* UIProcess/Plugins/gtk/PluginInfoCache.h:

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

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/Plugins/gtk/PluginInfoCache.cpp
Source/WebKit2/UIProcess/Plugins/gtk/PluginInfoCache.h

index 9020b08fb45ef2c9050a0b256aed1bf3101add54..7df676a5e6706dc9fa715a6e01926a8f70a5be5f 100644 (file)
@@ -1,3 +1,26 @@
+2015-11-01  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Use RunLoop::Timer in PluginInfoCache
+        https://bugs.webkit.org/show_bug.cgi?id=150757
+
+        Reviewed by Darin Adler.
+
+        Use RunLoop::Timer instead of GMainLoopSource to save the cache
+        contents in an idle. Also remove the mutex, since RunLoop::Timer
+        is thread safe and saveToFile() is private and only called by the
+        main thread loop. Also removed the code to save the file in the
+        destructor since PluginInfoCache is a singleton and never
+        destroyed. It's very unlikely that the program finished before the
+        cache is saved, but even if that happens it would be harmless, the
+        cache will be saved at some point the next time.
+
+        * UIProcess/Plugins/gtk/PluginInfoCache.cpp:
+        (WebKit::PluginInfoCache::PluginInfoCache):
+        (WebKit::PluginInfoCache::updatePluginInfo):
+        (WebKit::PluginInfoCache::~PluginInfoCache):
+        (WebKit::PluginInfoCache::saveToFile):
+        * UIProcess/Plugins/gtk/PluginInfoCache.h:
+
 2015-11-01  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] Use a RunLoop::Timer to schedule rendering frames in accelerated compositing mode
index 6c2c77f87340b0cf0e980126982c41ecf6682074..93450335fe1bf3e2e4ee7539b57a2cbee2bea678 100644 (file)
@@ -44,8 +44,11 @@ PluginInfoCache& PluginInfoCache::singleton()
 
 PluginInfoCache::PluginInfoCache()
     : m_cacheFile(g_key_file_new())
+    , m_saveToFileIdle(RunLoop::main(), this, &PluginInfoCache::saveToFile)
     , m_readOnlyMode(false)
 {
+    m_saveToFileIdle.setPriority(G_PRIORITY_DEFAULT_IDLE);
+
     GUniquePtr<char> cacheDirectory(g_build_filename(g_get_user_cache_dir(), "webkitgtk", nullptr));
     if (WebCore::makeAllDirectories(cacheDirectory.get())) {
         m_cachePath.reset(g_build_filename(cacheDirectory.get(), "plugins", nullptr));
@@ -71,16 +74,10 @@ PluginInfoCache::PluginInfoCache()
 
 PluginInfoCache::~PluginInfoCache()
 {
-    if (m_saveToFileIdle.isScheduled()) {
-        m_saveToFileIdle.cancel();
-        saveToFile();
-    }
 }
 
 void PluginInfoCache::saveToFile()
 {
-    std::lock_guard<Lock> lock(m_mutex);
-
     gsize dataLength;
     GUniquePtr<char> data(g_key_file_to_data(m_cacheFile.get(), &dataLength, nullptr));
     if (!data)
@@ -142,11 +139,10 @@ void PluginInfoCache::updatePluginInfo(const String& pluginPath, const PluginMod
     if (m_cachePath && !m_readOnlyMode) {
         // Save the cache file in an idle to make sure it happens in the main thread and
         // it's done only once when this is called multiple times in a very short time.
-        std::lock_guard<Lock> lock(m_mutex);
-        if (m_saveToFileIdle.isScheduled())
+        if (m_saveToFileIdle.isActive())
             return;
 
-        m_saveToFileIdle.schedule("[WebKit] PluginInfoCache::saveToFile", std::bind(&PluginInfoCache::saveToFile, this), G_PRIORITY_DEFAULT_IDLE);
+        m_saveToFileIdle.startOneShot(0);
     }
 }
 
index c2ba9208c0e87423e4ad90b72e23fb1822a7ca82..1af7085e2570c01420810b0421533e9cc756e08e 100644 (file)
 #if ENABLE(NETSCAPE_PLUGIN_API)
 
 #include "PluginModuleInfo.h"
-#include <mutex>
-#include <wtf/Lock.h>
 #include <wtf/NeverDestroyed.h>
-#include <wtf/glib/GMainLoopSource.h>
+#include <wtf/RunLoop.h>
 #include <wtf/glib/GUniquePtr.h>
 
 namespace WebKit {
@@ -54,9 +52,8 @@ private:
 
     GUniquePtr<GKeyFile> m_cacheFile;
     GUniquePtr<char> m_cachePath;
-    GMainLoopSource m_saveToFileIdle;
+    RunLoop::Timer<PluginInfoCache> m_saveToFileIdle;
     bool m_readOnlyMode;
-    Lock m_mutex;
 };
 
 } // namespace WebKit