rendered paste bodyIndex: 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)
{