All pastes #1300576 Raw Edit

Unnamed

public text v1 · immutable
#1300576 ·published 2009-01-06 00:51 UTC
rendered paste body
Index: libs/libmythtv/siscan.cpp
===================================================================
--- libs/libmythtv/siscan.cpp	(revision 19573)
+++ libs/libmythtv/siscan.cpp	(working copy)
@@ -112,7 +112,6 @@
     inputname.detach();
 
     // Initialize statics
-    init_freq_tables();
     current = transport_scan_items_it_t( scanTransports.end());
 
     signalMonitor->AddListener(this);
@@ -148,6 +147,7 @@
     disconnect();
     StopScanner();
     VERBOSE(VB_SIPARSER, LOC + "SIScanner Stopped");
+    teardown_frequency_tables();
     QObject::deleteLater();
 }
 
@@ -821,7 +821,9 @@
             name_num++;
             freq += ft.frequencyStep;
         }
+        delete *it;
     }
+    tables.clear();
 
     timer.start();
     waitingForTables = false;
Index: libs/libmythtv/frequencytables.h
===================================================================
--- libs/libmythtv/frequencytables.h	(revision 19573)
+++ libs/libmythtv/frequencytables.h	(working copy)
@@ -26,10 +26,10 @@
 typedef QMap<QString, const FrequencyTable*> freq_table_map_t;
 typedef vector<const FrequencyTable*>        freq_table_list_t;
 
-bool init_freq_tables();
+bool teardown_frequency_tables(void);
 
 freq_table_list_t get_matching_freq_tables(
-    QString format, QString modulation, QString country);
+    const QString &format, const QString &modulation, const QString &country);
 
 MPUBLIC long long get_center_frequency(
     QString format, QString modulation, QString country, int freqid);
Index: libs/libmythtv/datadirect.cpp
===================================================================
--- libs/libmythtv/datadirect.cpp	(revision 19573)
+++ libs/libmythtv/datadirect.cpp	(working copy)
@@ -745,6 +745,8 @@
         new_channels++;
     }
 
+    teardown_frequency_tables();
+
     return new_channels;
 }
 
Index: libs/libmythtv/frequencytables.cpp
===================================================================
--- libs/libmythtv/frequencytables.cpp	(revision 19573)
+++ libs/libmythtv/frequencytables.cpp	(working copy)
@@ -3,9 +3,13 @@
 #include "channelutil.h"
 #include "compat.h"
 
-freq_table_map_t frequencies;
+static bool             frequencies_initialized = false;
+static QMutex           frequencies_lock;
+static freq_table_map_t frequencies;
 
 static void init_freq_tables(freq_table_map_t&);
+static freq_table_list_t get_matching_freq_tables_internal(
+    const QString &format, const QString &modulation, const QString &country);
 
 TransportScanItem::TransportScanItem()
     : mplexid((uint)-1),  FriendlyName(""),
@@ -166,24 +170,29 @@
     return str;
 }
 
-bool init_freq_tables()
+static bool init_freq_tables(void)
 {
-    static bool statics_initialized = false;
-    static QMutex statics_lock;
-    statics_lock.lock();
-    if (!statics_initialized)
+    if (!frequencies_initialized)
     {
         init_freq_tables(frequencies);
-        statics_initialized = true;
+        frequencies_initialized = true;
     }
-    statics_lock.unlock();
+    return true;
+}
 
+bool teardown_frequency_tables(void)
+{
+    QMutexLocker locker(&frequencies_lock);
+    if (frequencies_initialized)
+    {
+        frequencies.clear();
+        frequencies_initialized = false;
+    }
     return true;
 }
-bool just_here_to_force_init = init_freq_tables();
 
-freq_table_list_t get_matching_freq_tables(
-    QString format, QString modulation, QString country)
+static freq_table_list_t get_matching_freq_tables_internal(
+    const QString &format, const QString &modulation, const QString &country)
 {
     const freq_table_map_t &fmap = frequencies;
 
@@ -203,11 +212,30 @@
     return list;
 }
 
+freq_table_list_t get_matching_freq_tables(
+    const QString &format, const QString &modulation, const QString &country)
+{
+    QMutexLocker locker(&frequencies_lock);
+    init_freq_tables();
+
+    freq_table_list_t list =
+        get_matching_freq_tables_internal(format, modulation, country);
+
+    freq_table_list_t new_list;
+    for (uint i = 0; i < list.size(); i++)
+        new_list.push_back(new FrequencyTable(*list[i]));
+
+    return new_list;
+}
+
 long long get_center_frequency(
     QString format, QString modulation, QString country, int freqid)
 {
+    QMutexLocker locker(&frequencies_lock);
+    init_freq_tables();
+
     freq_table_list_t list =
-        get_matching_freq_tables(format, modulation, country);
+        get_matching_freq_tables_internal(format, modulation, country);
 
     for (uint i = 0; i < list.size(); ++i)
     {
@@ -229,7 +257,7 @@
     modulation = (modulation == "8vsb") ? "vsb8" : modulation;
 
     freq_table_list_t list =
-        get_matching_freq_tables(format, modulation, country);
+        get_matching_freq_tables_internal(format, modulation, country);
     
     for (uint i = 0; i < list.size(); ++i)
     {