Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/jangernert/FeedReader.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrendan Long <self@brendanlong.com>2019-01-28 22:23:17 +0300
committerBrendan Long <self@brendanlong.com>2019-01-29 02:35:13 +0300
commit3fa9452aea70af4b843636f7893d941ff5579940 (patch)
tree0c9e65e749a0d14721db736d18a5e6fa9299a98c /src
parentf4ce70932c4ddc91783309708402c7c42d627455 (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.vala33
-rw-r--r--src/Backend/FeedServer.vala18
-rw-r--r--src/FeedReader.vala12
-rw-r--r--src/FeedReaderMain.vala2
-rw-r--r--src/Widgets/AddPopover.vala2
-rw-r--r--src/Widgets/ArticleList/ArticleList.vala151
-rw-r--r--src/Widgets/ArticleView.vala71
-rw-r--r--src/Widgets/ColumnView.vala16
-rw-r--r--src/Widgets/MainWindow.vala4
-rw-r--r--src/Widgets/MediaPlayer.vala47
-rw-r--r--src/Widgets/SharePopover.vala15
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");
}