Don't leak from QPlatformPrinterSupportPlugin::get()
authorBradley T. Hughes <bradley.hughes@nokia.com>
Fri, 2 Mar 2012 10:10:23 +0000 (11:10 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 5 Mar 2012 15:37:16 +0000 (16:37 +0100)
Cache the first QPlatformPrinterSupport returned from the first
QPlatformPrinterSupportPlugin, and treat it as an persistent singelton.

Change-Id: Ic1c83d7c1cdf4a09723a74e0b9fd485e0b0b3acb
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/printsupport/kernel/qplatformprintplugin.cpp

index 409de3e..2c87fcc 100644 (file)
@@ -58,15 +58,27 @@ QPlatformPrinterSupportPlugin::~QPlatformPrinterSupportPlugin()
 {
 }
 
+/*!
+    \internal
+
+    Returns a lazily-initialized singleton. Ownership is granted to the
+    QPlatformPrinterSupportPlugin, which is never unloaded or destroyed until
+    application exit, i.e. you can expect this pointer to always be valid and
+    multiple calls to this function will always return the same pointer.
+*/
 QPlatformPrinterSupport *QPlatformPrinterSupportPlugin::get()
 {
-    QStringList k = loader()->keys();
-    if (k.isEmpty())
-        return 0;
-    QPlatformPrinterSupportPlugin *plugin = qobject_cast<QPlatformPrinterSupportPlugin *>(loader()->instance(k.first()));
-    if (!plugin)
-        return 0;
-    return plugin->create(k.first());
+    static QPlatformPrinterSupport *singleton = 0;
+    if (!singleton) {
+        QStringList k = loader()->keys();
+        if (k.isEmpty())
+            return 0;
+        QPlatformPrinterSupportPlugin *plugin = qobject_cast<QPlatformPrinterSupportPlugin *>(loader()->instance(k.first()));
+        if (!plugin)
+            return 0;
+        singleton = plugin->create(k.first());
+    }
+    return singleton;
 }
 
 QT_END_NAMESPACE