[polari] urlPreview: Avoid blocking IO for stat
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [polari] urlPreview: Avoid blocking IO for stat
- Date: Wed, 5 Aug 2020 13:47:09 +0000 (UTC)
commit bda7a5a05a8872504d2075d0ccb1ae7d9c636f2b
Author: Florian Müllner <fmuellner gnome org>
Date: Sat Jul 25 17:29:46 2020 +0200
urlPreview: Avoid blocking IO for stat
GLib.file_test() is a convenient API, but does blocking IO. As we
are calling it for every single URL we encounter (either in messages
or logs), it's better to avoid the blocking and switch to the async
GIO API.
https://gitlab.gnome.org/GNOME/polari/-/issues/149
src/urlPreview.js | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
---
diff --git a/src/urlPreview.js b/src/urlPreview.js
index b818c812..b0bc1472 100644
--- a/src/urlPreview.js
+++ b/src/urlPreview.js
@@ -1,6 +1,8 @@
/* exported URLPreview */
const { Gio, GLib, GObject, Gtk, Pango } = imports.gi;
+Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish');
+
class Thumbnailer {
static getDefault() {
if (!this._singleton)
@@ -23,9 +25,8 @@ class Thumbnailer {
this._processData(data);
}
- _processData(data) {
- let check = GLib.file_test(`${data.filename}`, GLib.FileTest.EXISTS);
- if (check)
+ async _processData(data) {
+ if (await this._thumbExists(data))
this._generationDone(data);
else if (!this._subProc)
this._generateThumbnail(data);
@@ -57,6 +58,17 @@ class Thumbnailer {
});
}
+ async _thumbExists(data) {
+ const file = Gio.File.new_for_path(`${data.filename}`);
+ try {
+ await file.query_info_async(Gio.FILE_ATTRIBUTE_STANDARD_TYPE,
+ Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_DEFAULT, null);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
_generateFilename(url) {
let checksum = GLib.Checksum.new(GLib.ChecksumType.MD5);
checksum.update(url);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]