diff options
author | Brendan Long <self@brendanlong.com> | 2019-01-28 22:23:17 +0300 |
---|---|---|
committer | Brendan Long <self@brendanlong.com> | 2019-01-29 02:35:13 +0300 |
commit | 3fa9452aea70af4b843636f7893d941ff5579940 (patch) | |
tree | 0c9e65e749a0d14721db736d18a5e6fa9299a98c /src | |
parent | f4ce70932c4ddc91783309708402c7c42d627455 (diff) |
Remove unsafe threading
- Fix grabber to do DB inserts in the main thread
- Remove unsafe threading throughout the UI
Diffstat (limited to 'src')
-rw-r--r-- | src/Backend/Backend.vala | 33 | ||||
-rw-r--r-- | src/Backend/FeedServer.vala | 18 | ||||
-rw-r--r-- | src/FeedReader.vala | 12 | ||||
-rw-r--r-- | src/FeedReaderMain.vala | 2 | ||||
-rw-r--r-- | src/Widgets/AddPopover.vala | 2 | ||||
-rw-r--r-- | src/Widgets/ArticleList/ArticleList.vala | 151 | ||||
-rw-r--r-- | src/Widgets/ArticleView.vala | 71 | ||||
-rw-r--r-- | src/Widgets/ColumnView.vala | 16 | ||||
-rw-r--r-- | src/Widgets/MainWindow.vala | 4 | ||||
-rw-r--r-- | src/Widgets/MediaPlayer.vala | 47 | ||||
-rw-r--r-- | src/Widgets/SharePopover.vala | 15 |
11 files changed, 123 insertions, 248 deletions
diff --git a/src/Backend/Backend.vala b/src/Backend/Backend.vala index bbf6315b..4f426963 100644 --- a/src/Backend/Backend.vala +++ b/src/Backend/Backend.vala @@ -305,7 +305,7 @@ public async bool checkOnlineAsync() return null; }; - new GLib.Thread<void*>("checkOnlineAsync", run); + new Thread<void*>("checkOnlineAsync", run); yield; return online; } @@ -774,13 +774,11 @@ public void moveFeed(string feedID, string currentCatID, string? newCatID = null }); } -public void addFeed(string feedURL, string cat, bool isID, bool asynchron) +public void addFeed(string feedURL, string cat, bool isID) { string? catID = null; string? newCatName = null; string? feedID = null; - bool success = false; - string errmsg = ""; if(cat != "") { @@ -790,26 +788,13 @@ public void addFeed(string feedURL, string cat, bool isID, bool asynchron) newCatName = cat; } - if(asynchron) + string errmsg; + bool success = FeedServer.get_default().addFeed(feedURL, catID, newCatName, out feedID, out errmsg); + errmsg = success ? "" : errmsg; + feedAdded(!success, errmsg); + if(success) { - new GLib.Thread<void*>(null, () => { - success = FeedServer.get_default().addFeed(feedURL, catID, newCatName, out feedID, out errmsg); - errmsg = (success) ? "" : errmsg; // just to be sure :P - feedAdded(!success, errmsg); - - if(success) - { - startSync(); - } - - return null; - }); - } - else - { - success = FeedServer.get_default().addFeed(feedURL, catID, newCatName, out feedID, out errmsg); - errmsg = (success) ? "" : errmsg; - feedAdded(!success, errmsg); + startSync(); } } @@ -869,7 +854,7 @@ public void updateBadge() private async void callAsync(owned asyncPayload func) { SourceFunc callback = callAsync.callback; - new GLib.Thread<void*>(null, () => { + new Thread<void*>(null, () => { func(); Idle.add((owned) callback); return null; diff --git a/src/Backend/FeedServer.vala b/src/Backend/FeedServer.vala index c53bb922..d2de8455 100644 --- a/src/Backend/FeedServer.vala +++ b/src/Backend/FeedServer.vala @@ -391,6 +391,8 @@ public async void grabContent(GLib.Cancellable? cancellable = null) var articles = DataBase.readOnly().readUnfetchedArticles(); int size = articles.size; int i = 0; + var new_article_content = new Gee.ArrayList<Article>(); + GLib.Mutex mutex = GLib.Mutex(); if(size > 0) { @@ -441,7 +443,11 @@ public async void grabContent(GLib.Cancellable? cancellable = null) } if(cancellable == null || !cancellable.is_cancelled()) - DataBase.writeAccess().writeContent(article); + { + mutex.lock(); + new_article_content.add(article); + mutex.unlock(); + } ++i; syncProgress(_(@"Grabbing full content: $i / $size")); @@ -461,6 +467,16 @@ public async void grabContent(GLib.Cancellable? cancellable = null) Logger.error("FeedServer.grabContent: " + e.message); } + foreach(var content in new_article_content) + { + if (cancellable != null && cancellable.is_cancelled()) + return; + DataBase.writeAccess().writeContent(content); + } + + if (cancellable != null && cancellable.is_cancelled()) + return; + //update fulltext table DataBase.writeAccess().updateFTS(); } diff --git a/src/FeedReader.vala b/src/FeedReader.vala index 9c314925..b9b80533 100644 --- a/src/FeedReader.vala +++ b/src/FeedReader.vala @@ -216,17 +216,9 @@ protected override void shutdown() base.shutdown(); } -public async void sync() +public void sync() { - SourceFunc callback = sync.callback; - ThreadFunc<void*> run = () => { - FeedReaderBackend.get_default().startSync(); - Idle.add((owned) callback); - return null; - }; - - new GLib.Thread<void*>("sync", run); - yield; + FeedReaderBackend.get_default().startSync(); } public void cancelSync() diff --git a/src/FeedReaderMain.vala b/src/FeedReaderMain.vala index 1fe8417e..07afaf92 100644 --- a/src/FeedReaderMain.vala +++ b/src/FeedReaderMain.vala @@ -76,7 +76,7 @@ public static int main (string[] args) { Logger.init(verbose); Logger.debug(@"Adding feed $feedURL"); - FeedReaderBackend.get_default().addFeed(feedURL, "", false, true); + FeedReaderBackend.get_default().addFeed(feedURL, "", false); return 0; } diff --git a/src/Widgets/AddPopover.vala b/src/Widgets/AddPopover.vala index 8f1a619c..e5915983 100644 --- a/src/Widgets/AddPopover.vala +++ b/src/Widgets/AddPopover.vala @@ -142,7 +142,7 @@ private void addFeed() } Logger.debug("addFeed: %s, %s".printf(m_urlEntry.text, (catID == "") ? "null" : catID)); - FeedReaderBackend.get_default().addFeed(m_urlEntry.text, catID, isID, true); + FeedReaderBackend.get_default().addFeed(m_urlEntry.text, catID, isID); setBusy(); } diff --git a/src/Widgets/ArticleList/ArticleList.vala b/src/Widgets/ArticleList/ArticleList.vala index 6bbc01f6..fa2ae03e 100644 --- a/src/Widgets/ArticleList/ArticleList.vala +++ b/src/Widgets/ArticleList/ArticleList.vala @@ -24,7 +24,6 @@ private ArticleListState m_state = ArticleListState.ALL; private string m_searchTerm = ""; private bool m_syncing = false; private InAppNotification m_overlay; -private GLib.Thread<void*>? m_loadThread = null; private ArticleListScroll m_currentScroll; private ArticleListScroll m_scroll1; private ArticleListScroll m_scroll2; @@ -101,60 +100,42 @@ public ArticleList() this.size_allocate.connect((allocation) => { if(allocation.height != m_height) { - if(allocation.height > m_height - && m_stack.get_visible_child_name() != "empty" - && m_stack.get_visible_child_name() != "syncing") - { - Logger.debug("ArticleList: size changed"); - if(m_currentList.needLoadMore(allocation.height)) - loadMore.begin((obj, res) =>{ - loadMore.end(res); - }); + if(allocation.height > m_height + && m_stack.get_visible_child_name() != "empty" + && m_stack.get_visible_child_name() != "syncing") + { + Logger.debug("ArticleList: size changed"); + if(m_currentList.needLoadMore(allocation.height)) + loadMore(); } - m_height = allocation.height; + m_height = allocation.height; } }); } -public async void newList(Gtk.StackTransitionType transition = Gtk.StackTransitionType.CROSSFADE) +public void newList(Gtk.StackTransitionType transition = Gtk.StackTransitionType.CROSSFADE) { Logger.debug("ArticleList: newList"); if(m_overlay != null) m_overlay.dismiss(); - if(m_loadThread != null) { - m_loadThread.join(); - m_loadThread = null; - } - Logger.debug("ArticleList: disallow signals from scroll"); m_currentScroll.allowSignals(false); Gee.List<Article> articles = new Gee.LinkedList<Article>(); uint offset = 0; - SourceFunc callback = newList.callback; - //----------------------------------------------------------------------------------------------------------------------------------------------------- - ThreadFunc<void*> run = () => { - int height = this.get_allocated_height(); - uint limit = height/100 + 5; - offset = getListOffset(); - - Logger.debug("load articles from db"); - articles = DataBase.readOnly().read_articles(m_selectedFeedListID, - m_selectedFeedListType, - m_state, - m_searchTerm, - limit, - offset); - Logger.debug("actual articles loaded: " + articles.size.to_string()); - - Idle.add((owned) callback, GLib.Priority.HIGH_IDLE); - return null; - }; - //----------------------------------------------------------------------------------------------------------------------------------------------------- - - m_loadThread = new GLib.Thread<void*>("create", run); - yield; + int height = this.get_allocated_height(); + uint limit = height/100 + 5; + offset = getListOffset(); + + Logger.debug("load articles from db"); + articles = DataBase.readOnly().read_articles(m_selectedFeedListID, + m_selectedFeedListType, + m_state, + m_searchTerm, + limit, + offset); + Logger.debug("actual articles loaded: " + articles.size.to_string()); if(articles.size == 0) { @@ -168,9 +149,7 @@ public async void newList(Gtk.StackTransitionType transition = Gtk.StackTransiti } else { - loadNewer.begin((int)offset, 0, (obj, res) =>{ - loadNewer.end(res); - }); + loadNewer((int)offset, 0); } } else @@ -225,46 +204,27 @@ private void checkForNewRows() Logger.debug(@"new rowCount: $count"); if(count > 0) { - loadNewer.begin(count, offset, (obj, res) =>{ - loadNewer.end(res); - }); + loadNewer(count, offset); } } -private async void loadMore() +private void loadMore() { if(m_currentList == null) return; Logger.debug("ArticleList.loadmore()"); - if(m_loadThread != null) { - m_loadThread.join(); - m_loadThread = null; - } + Logger.debug("load articles from db"); + uint offset = m_currentList.getSizeForState() + determineNewRowCount(null, null); - Gee.List<Article> articles = new Gee.LinkedList<Article>(); - SourceFunc callback = loadMore.callback; - //----------------------------------------------------------------------------------------------------------------------------------------------------- - ThreadFunc<void*> run = () => { - Logger.debug("load articles from db"); - uint offset = m_currentList.getSizeForState() + determineNewRowCount(null, null); - - articles = DataBase.readOnly().read_articles(m_selectedFeedListID, - m_selectedFeedListType, - m_state, - m_searchTerm, - m_dynamicRowThreshold, - offset); - Logger.debug("actual articles loaded: " + articles.size.to_string()); - - Idle.add((owned) callback, GLib.Priority.HIGH_IDLE); - return null; - }; - //----------------------------------------------------------------------------------------------------------------------------------------------------- - - m_loadThread = new GLib.Thread<void*>("create", run); - yield; + var articles = DataBase.readOnly().read_articles(m_selectedFeedListID, + m_selectedFeedListType, + m_state, + m_searchTerm, + m_dynamicRowThreshold, + offset); + Logger.debug("actual articles loaded: " + articles.size.to_string()); if(articles.size > 0) { @@ -287,34 +247,18 @@ private async void loadMore() } } -private async void loadNewer(int newCount, int offset) +private void loadNewer(int newCount, int offset) { Logger.debug(@"ArticleList: loadNewer($newCount)"); - if(m_loadThread != null) { - m_loadThread.join(); - m_loadThread = null; - } - - Gee.List<Article> articles = new Gee.LinkedList<Article>(); - SourceFunc callback = loadNewer.callback; - //----------------------------------------------------------------------------------------------------------------------------------------------------- - ThreadFunc<void*> run = () => { - Logger.debug("load articles from db"); - articles = DataBase.readOnly().read_articles(m_selectedFeedListID, - m_selectedFeedListType, - m_state, - m_searchTerm, - newCount, - offset); - Logger.debug("actual articles loaded: " + articles.size.to_string()); - - Idle.add((owned) callback, GLib.Priority.HIGH_IDLE); - return null; - }; - //----------------------------------------------------------------------------------------------------------------------------------------------------- - m_loadThread = new GLib.Thread<void*>("create", run); - yield; + Logger.debug("load articles from db"); + var articles = DataBase.readOnly().read_articles(m_selectedFeedListID, + m_selectedFeedListType, + m_state, + m_searchTerm, + newCount, + offset); + Logger.debug("actual articles loaded: " + articles.size.to_string()); if(articles.size > 0) { @@ -345,7 +289,7 @@ private async void loadNewer(int newCount, int offset) } -public async void updateArticleList() +public void updateArticleList() { Logger.debug(@"ArticleList: updateArticleList()"); @@ -353,17 +297,10 @@ public async void updateArticleList() || m_stack.get_visible_child_name() == "syncing") { Logger.debug("ArticleList: updateArticleList(): emtpy list -> create newList()"); - newList.begin(Gtk.StackTransitionType.CROSSFADE, (obj, res) => { - newList.end(res); - }); + newList(Gtk.StackTransitionType.CROSSFADE); return; } - if(m_loadThread != null) { - m_loadThread.join(); - m_loadThread = null; - } - m_currentList.setAllUpdated(false); var articles = DataBase.readOnly().read_article_stats(m_currentList.getIDs()); var children = m_currentList.get_children(); diff --git a/src/Widgets/ArticleView.vala b/src/Widgets/ArticleView.vala index ff001b18..95d6bc80 100644 --- a/src/Widgets/ArticleView.vala +++ b/src/Widgets/ArticleView.vala @@ -98,13 +98,11 @@ public ArticleView() if(allocation.width != m_width || allocation.height != m_height) { - m_width = allocation.width; - m_height = allocation.height; - Logger.debug("ArticleView: size changed"); - setBackgroundColor(); - recalculate.begin((obj, res) => { - recalculate.end(res); - }); + m_width = allocation.width; + m_height = allocation.height; + Logger.debug("ArticleView: size changed"); + setBackgroundColor(); + recalculate(); } }); @@ -199,7 +197,7 @@ private WebKit.WebView getNewView() return view; } -public async void fillContent(string articleID) +public void fillContent(string articleID) { Logger.debug(@"ArticleView: load article $articleID"); @@ -218,17 +216,7 @@ public async void fillContent(string articleID) m_OngoingScrollID = 0; } - Article article = null; - SourceFunc callback = fillContent.callback; - - ThreadFunc<void*> run = () => { - article = DataBase.readOnly().read_article(articleID); - Idle.add((owned) callback, GLib.Priority.HIGH_IDLE); - return null; - }; - - new GLib.Thread<void*>("fillContent", run); - yield; + Article article = DataBase.readOnly().read_article(articleID); GLib.Idle.add(() => { Logger.debug("ArticleView: WebView load html"); @@ -403,9 +391,7 @@ public void open_link(WebKit.LoadEvent load_event) m_currentView.grab_focus(); m_firstTime = false; } - recalculate.begin((obj, res) => { - recalculate.end(res); - }); + recalculate(); break; default: Logger.debug("ArticleView: load ??????"); @@ -538,9 +524,7 @@ private void on_extension_appeared(GLib.DBusConnection connection, string name, m_messenger.message.connect((message) => { Logger.debug(@"ArticleView: webextension-message: $message"); }); - recalculate.begin((obj, res) => { - recalculate.end(res); - }); + recalculate(); } catch(GLib.IOError e) { @@ -548,27 +532,20 @@ private void on_extension_appeared(GLib.DBusConnection connection, string name, } } -private async void recalculate() +private void recalculate() { - SourceFunc callback = recalculate.callback; - ThreadFunc<void*> run = () => { - try - { - if(m_connected - && m_stack.get_visible_child_name() != "empty" - && m_stack.get_visible_child_name() != "crash" - && m_currentView != null) - m_messenger.recalculate(); - } - catch(Error e) - { - Logger.warning("ArticleView: recalculate " + e.message); - } - Idle.add((owned) callback, GLib.Priority.HIGH_IDLE); - return null; - }; - new GLib.Thread<void*>("recalculate", run); - yield; + try + { + if(m_connected + && m_stack.get_visible_child_name() != "empty" + && m_stack.get_visible_child_name() != "crash" + && m_currentView != null) + m_messenger.recalculate(); + } + catch(Error e) + { + Logger.warning("ArticleView: recalculate " + e.message); + } } private bool onClick(Gdk.EventButton event) @@ -695,9 +672,7 @@ private bool updateScroll(Gdk.EventMotion event) public void load(string? id = null) { string articleID = (id == null) ? m_currentArticle : id; - fillContent.begin(articleID, (obj, res) => { - fillContent.end(res); - }); + fillContent(articleID); } private bool updateDragMomentum() diff --git a/src/Widgets/ColumnView.vala b/src/Widgets/ColumnView.vala index 678dedf9..c90a0a74 100644 --- a/src/Widgets/ColumnView.vala +++ b/src/Widgets/ColumnView.vala @@ -161,9 +161,7 @@ private ColumnView() m_headerbar.refresh.connect(() => { syncStarted(); var app = FeedReaderApp.get_default(); - app.sync.begin((obj, res) => { - app.sync.end(res); - }); + app.sync(); }); m_headerbar.cancel.connect(() => { @@ -240,18 +238,14 @@ public void newArticleList(Gtk.StackTransitionType transition = Gtk.StackTransit { ulong id = 0; id = m_articleList.draw.connect_after(() => { - m_articleList.newList.begin(transition, (obj, res) => { - m_articleList.newList.end(res); - }); + m_articleList.newList(transition); m_articleList.disconnect(id); return false; }); } else { - m_articleList.newList.begin(transition, (obj, res) => { - m_articleList.newList.end(res); - }); + m_articleList.newList(transition); } } @@ -272,9 +266,7 @@ public void reloadArticleView() public void updateArticleList() { - m_articleList.updateArticleList.begin((obj,res) => { - m_articleList.updateArticleList.end(res); - }); + m_articleList.updateArticleList(); } private void setArticleListState(ArticleListState state) diff --git a/src/Widgets/MainWindow.vala b/src/Widgets/MainWindow.vala index beeb332d..e29105ef 100644 --- a/src/Widgets/MainWindow.vala +++ b/src/Widgets/MainWindow.vala @@ -623,9 +623,7 @@ private bool shortcuts(Gdk.EventKey event) { Logger.debug("shortcut: sync"); var app = FeedReaderApp.get_default(); - app.sync.begin((obj, res) => { - app.sync.end(res); - }); + app.sync(); return true; } diff --git a/src/Widgets/MediaPlayer.vala b/src/Widgets/MediaPlayer.vala index ff0eb476..ec9585bc 100644 --- a/src/Widgets/MediaPlayer.vala +++ b/src/Widgets/MediaPlayer.vala @@ -44,43 +44,32 @@ public MediaPlayer(string url) m_type = MediaType.AUDIO; m_URL = url; - inspectMedia.begin((obj, res) => { - buildUI(); - loaded(); - inspectMedia.end(res); - }); + inspectMedia(); + buildUI(); + loaded(); } -private async void inspectMedia() +private void inspectMedia() { - SourceFunc callback = inspectMedia.callback; + try + { + var discoverer = new Gst.PbUtils.Discoverer((Gst.ClockTime)(10*Gst.SECOND)); + var info = discoverer.discover_uri(m_URL); - ThreadFunc<void*> run = () => { - try + foreach(Gst.PbUtils.DiscovererStreamInfo i in info.get_stream_list()) { - var discoverer = new Gst.PbUtils.Discoverer((Gst.ClockTime)(10*Gst.SECOND)); - var info = discoverer.discover_uri(m_URL); - - foreach(Gst.PbUtils.DiscovererStreamInfo i in info.get_stream_list()) + if(i is Gst.PbUtils.DiscovererVideoInfo) { - if(i is Gst.PbUtils.DiscovererVideoInfo) - { - var v = (Gst.PbUtils.DiscovererVideoInfo)i; - m_aspectRatio = ((double)v.get_width())/((double)v.get_height()); - m_type = MediaType.VIDEO; - } + var v = (Gst.PbUtils.DiscovererVideoInfo)i; + m_aspectRatio = ((double)v.get_width())/((double)v.get_height()); + m_type = MediaType.VIDEO; } } - catch (Error e) - { - Logger.error("Unable discover_uri: " + e.message); - } - Idle.add((owned) callback, GLib.Priority.HIGH_IDLE); - return null; - }; - - new GLib.Thread<void*>("inspectMedia", run); - yield; + } + catch (Error e) + { + Logger.error("Unable discover_uri: " + e.message); + } } private void buildUI() diff --git a/src/Widgets/SharePopover.vala b/src/Widgets/SharePopover.vala index 77b82a2e..dcb0c70f 100644 --- a/src/Widgets/SharePopover.vala +++ b/src/Widgets/SharePopover.vala @@ -122,25 +122,16 @@ private void clicked(Gtk.ListBoxRow row) } -private async void shareAsync(string id, string url) +private void shareInternal(string id, string url) { - SourceFunc callback = shareAsync.callback; - new GLib.Thread<void*>(null, () => { - Share.get_default().addBookmark(id, url); - Idle.add((owned) callback, GLib.Priority.HIGH_IDLE); - return null; - }); - yield; + Share.get_default().addBookmark(id, url); } private void shareURL(string id, string url) { this.hide(); startShare(); - shareAsync.begin(id, url, (obj, res) => { - shareAsync.end(res); - shareDone(); - }); + shareInternal(id, url); string idString = (id == null || id == "") ? "" : @" to $id"; Logger.debug(@"bookmark: $url$idString"); } |