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 freq_table_map_t; typedef vector 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) {