aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/epgcache.h
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-07-22 15:09:02 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-07-22 15:09:02 +0000
commitfff59f79bfb7220c58b1821c522d7f0bebbe5de5 (patch)
tree132a3ebfb83da07290b345a1da1803b250fcfd25 /lib/dvb/epgcache.h
parent0cb7bd236d96662117bf8928cedd953b7b68579f (diff)
downloadenigma2-fff59f79bfb7220c58b1821c522d7f0bebbe5de5.tar.gz
enigma2-fff59f79bfb7220c58b1821c522d7f0bebbe5de5.zip
faster EPG (calculate number of sections and abort when all sections available) fix warnings
Diffstat (limited to 'lib/dvb/epgcache.h')
-rw-r--r--lib/dvb/epgcache.h46
1 files changed, 28 insertions, 18 deletions
diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h
index 5dea4630..1282cc8b 100644
--- a/lib/dvb/epgcache.h
+++ b/lib/dvb/epgcache.h
@@ -4,12 +4,8 @@
#include <vector>
#include <list>
#include <ext/hash_map>
+#include <ext/hash_set>
-// check if gcc version >= 3.4
-#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ == 4 )
-#else
-#include <ext/stl_hash_fun.h>
-#endif
#include <errno.h>
#include <lib/dvb/eit.h>
@@ -74,26 +70,39 @@ struct uniqueEPGKey
#define timeMap std::map<time_t, eventData*>
#define channelMapIterator std::map<iDVBChannel*, channel_data*>::iterator
-
-#define tmpMap std::map<uniqueEPGKey, std::pair<time_t, int> >
#define updateMap std::map<eDVBChannelID, time_t>
-#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1
- #define eventCache __gnu_cxx::hash_map<uniqueEPGKey, std::pair<eventMap, timeMap>, __gnu_cxx::hash<uniqueEPGKey>, uniqueEPGKey::equal>
- namespace __gnu_cxx
-#else // for older gcc use following
- #define eventCache std::hash_map<uniqueEPGKey, std::pair<eventMap, timeMap>, std::hash<uniqueEPGKey>, uniqueEPGKey::equal >
- namespace std
-#endif
+struct hash_32
{
-template<> struct hash<uniqueEPGKey>
+ inline size_t operator()( const __u32 &x) const
+ {
+ return (x >> 8)&0xFFFF;
+ }
+};
+
+struct equal_32
+{
+ inline size_t operator()(const __u32 &x, const __u32 &y) const
+ {
+ return x == y;
+ }
+};
+
+struct hash_uniqueEPGKey
{
inline size_t operator()( const uniqueEPGKey &x) const
{
- return (x.tsid << 16) | x.onid;
+ return (x.onid << 16) | x.tsid;
}
};
-}
+
+#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1
+ #define eventCache __gnu_cxx::hash_map<uniqueEPGKey, std::pair<eventMap, timeMap>, hash_uniqueEPGKey, uniqueEPGKey::equal>
+ #define tidMap __gnu_cxx::hash_set<__u32, hash_32, equal_32>
+#else // for older gcc use following
+ #define eventCache std::hash_map<uniqueEPGKey, std::pair<eventMap, timeMap>, hash_uniqueEPGKey, uniqueEPGKey::equal >
+ #define tidMap std::hash_map<__u32, hash_32, equal_32>
+#endif
class eventData
{
@@ -149,6 +158,7 @@ class eEPGCache: public eMainloop, private eThread, public Object
ePtr<eDVBChannel> channel;
ePtr<eConnection> m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn;
ePtr<iDVBSectionReader> m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader;
+ tidMap seenSections, calcedSections;
void readData(const __u8 *data);
void startChannel();
void startEPG();
@@ -211,7 +221,7 @@ private:
// called from epgcache thread
void save();
void load();
- int sectionRead(const __u8 *data, int source, channel_data *channel);
+ void sectionRead(const __u8 *data, int source, channel_data *channel);
void gotMessage(const Message &message);
void flushEPG(const uniqueEPGKey & s=uniqueEPGKey());
void cleanLoop();