diff options
author | 2014-01-13 18:40:57 +0100 | |
---|---|---|
committer | 2014-01-13 23:08:27 +0100 | |
commit | d71336f48be10df737b811edc7796d6a9a88498e (patch) | |
tree | 7bfec4cd17adfe5855c6b57d1c0e1ecc0f705e3c | |
parent | 90ecce5b72e8d49d60731e9080c3d8fc417c4079 (diff) | |
download | newsboat-d71336f48be10df737b811edc7796d6a9a88498e.tar.gz newsboat-d71336f48be10df737b811edc7796d6a9a88498e.tar.zst newsboat-d71336f48be10df737b811edc7796d6a9a88498e.zip |
fix hideous Perl mistake.
-rw-r--r-- | include/itemview_formaction.h | 5 | ||||
-rw-r--r-- | include/rss.h | 1 | ||||
-rw-r--r-- | src/itemview_formaction.cpp | 1 | ||||
-rw-r--r-- | src/rss.cpp | 44 | ||||
-rwxr-xr-x | txt2h.pl | 2 |
5 files changed, 34 insertions, 19 deletions
diff --git a/include/itemview_formaction.h b/include/itemview_formaction.h index e7770b90..b845d152 100644 --- a/include/itemview_formaction.h +++ b/include/itemview_formaction.h @@ -16,7 +16,10 @@ class itemview_formaction : public formaction { virtual ~itemview_formaction(); virtual void prepare(); virtual void init(); - inline void set_guid(const std::string& guid_) { guid = guid_; } + inline void set_guid(const std::string& guid_) { + LOG(LOG_DEBUG, "itemview_formaction::set_guid: new guid = %s", guid_.c_str()); + guid = guid_; + } inline void set_feed(std::tr1::shared_ptr<rss_feed> fd) { feed = fd; } void set_highlightphrase(const std::string& text); keymap_hint_entry * get_keymap_hint(); diff --git a/include/rss.h b/include/rss.h index f4f0ccdb..e6f8527f 100644 --- a/include/rss.h +++ b/include/rss.h @@ -235,6 +235,7 @@ namespace newsbeuter { unsigned int idx; unsigned int order; dl_status status_; + mutex items_guid_map_mutex; }; class rss_ignores : public config_action_handler { diff --git a/src/itemview_formaction.cpp b/src/itemview_formaction.cpp index 5325f696..7d4818c6 100644 --- a/src/itemview_formaction.cpp +++ b/src/itemview_formaction.cpp @@ -61,6 +61,7 @@ void itemview_formaction::prepare() { render_width -= 5; } + LOG(LOG_DEBUG, "itemview_formaction::prepare: guid = %s", guid.c_str()); std::tr1::shared_ptr<rss_item> item = feed->get_item_by_guid(guid); listformatter listfmt; diff --git a/src/rss.cpp b/src/rss.cpp index 883b8761..4fca5ef4 100644 --- a/src/rss.cpp +++ b/src/rss.cpp @@ -215,12 +215,17 @@ std::tr1::shared_ptr<rss_item> rss_feed::get_item_by_guid(const std::string& gui } std::tr1::shared_ptr<rss_item> rss_feed::get_item_by_guid_unlocked(const std::string& guid) { - std::tr1::unordered_map<std::string, std::tr1::shared_ptr<rss_item> >::const_iterator it; - if ((it = items_guid_map.find(guid)) != items_guid_map.end()) { - return it->second; + LOG(LOG_DEBUG, "get_item_by_guid_unlocked: guid = %s", guid.c_str()); + { + scope_mutex lock(&items_guid_map_mutex); + std::tr1::unordered_map<std::string, std::tr1::shared_ptr<rss_item> >::const_iterator it; + if ((it = items_guid_map.find(guid)) != items_guid_map.end()) { + return it->second; + } + LOG(LOG_DEBUG, "rss_feed::get_item_by_guid_unlocked: hit dummy item!"); + LOG(LOG_DEBUG, "rss_feed::get_item_by_guid_unlocked: items_guid_map.size = %d", items_guid_map.size()); } - LOG(LOG_DEBUG, "rss_feed::get_item_by_guid_unlocked: hit dummy item!"); - // abort(); + abort(); return std::tr1::shared_ptr<rss_item>(new rss_item(ch)); // should never happen! } @@ -439,16 +444,19 @@ void rss_feed::update_items(std::vector<std::tr1::shared_ptr<rss_feed> > feeds) matcher m(query); items_.clear(); - items_guid_map.clear(); - - for (std::vector<std::tr1::shared_ptr<rss_feed> >::iterator it=feeds.begin();it!=feeds.end();++it) { - if ((*it)->rssurl().substr(0,6) != "query:") { // don't fetch items from other query feeds! - for (std::vector<std::tr1::shared_ptr<rss_item> >::iterator jt=(*it)->items().begin();jt!=(*it)->items().end();++jt) { - if (m.matches(jt->get())) { - LOG(LOG_DEBUG, "rss_feed::update_items: matcher matches!"); - (*jt)->set_feedptr(*it); - items_.push_back(*jt); - items_guid_map[(*jt)->guid()] = *jt; + { + scope_mutex lock(&items_guid_map_mutex); + items_guid_map.clear(); + + for (std::vector<std::tr1::shared_ptr<rss_feed> >::iterator it=feeds.begin();it!=feeds.end();++it) { + if ((*it)->rssurl().substr(0,6) != "query:") { // don't fetch items from other query feeds! + for (std::vector<std::tr1::shared_ptr<rss_item> >::iterator jt=(*it)->items().begin();jt!=(*it)->items().end();++jt) { + if (m.matches(jt->get())) { + LOG(LOG_DEBUG, "rss_feed::update_items: matcher matches!"); + (*jt)->set_feedptr(*it); + items_.push_back(*jt); + items_guid_map[(*jt)->guid()] = *jt; + } } } } @@ -577,7 +585,10 @@ void rss_feed::purge_deleted_items() { std::vector<std::tr1::shared_ptr<rss_item> >::iterator it=items_.begin(); while (it!=items_.end()) { if ((*it)->deleted()) { - items_guid_map.erase((*it)->guid()); + { + scope_mutex lock2(&items_guid_map_mutex); + items_guid_map.erase((*it)->guid()); + } items_.erase(it); it = items_.begin(); // items_ modified -> iterator invalidated } else { @@ -619,5 +630,4 @@ void rss_feed::load() { ch->fetch_descriptions(this); } - } @@ -3,7 +3,7 @@ use strict; use File::Basename; -if (length(@ARGV) < 1) { +if (scalar(@ARGV) < 1) { print STDOUT "usage: $0 <stflfile> [<extension>]\n"; exit(1); } |