From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: Robert Pluim Newsgroups: gmane.emacs.gnus.general,gmane.emacs.devel Subject: Re: Rendering regression in Gnus with gnus-treat-from-gravatar Date: Tue, 14 Apr 2020 15:14:11 +0200 Message-ID: References: <877dym5fes.fsf@tullinup.koldfront.dk> <87d08ejbmj.fsf@tullinup.koldfront.dk> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="19511"; mail-complaints-to="usenet@ciao.gmane.io" Cc: ding@gnus.org, emacs-devel@gnu.org To: Adam =?utf-8?Q?Sj=C3=B8gren?= Original-X-From: ding-owner+M37290@lists.math.uh.edu Tue Apr 14 15:15:21 2020 Return-path: Envelope-to: ding-account@m.gmane-mx.org Original-Received: from lists1.math.uh.edu ([129.7.128.208]) by ciao.gmane.io with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jOLPL-0004ux-R9 for ding-account@m.gmane-mx.org; Tue, 14 Apr 2020 15:15:19 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.math.uh.edu) by lists1.math.uh.edu with smtp (Exim 4.92.3) (envelope-from ) id 1jOLOW-0006AO-2i; Tue, 14 Apr 2020 08:14:28 -0500 Original-Received: from mx2.math.uh.edu ([129.7.128.33]) by lists1.math.uh.edu with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92.3) (envelope-from ) id 1jOLOR-00067Z-4L for ding@lists.math.uh.edu; Tue, 14 Apr 2020 08:14:23 -0500 Original-Received: from quimby.gnus.org ([95.216.78.240]) by mx2.math.uh.edu with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92.3) (envelope-from ) id 1jOLOP-0007nf-Hx for ding@lists.math.uh.edu; Tue, 14 Apr 2020 08:14:22 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnus.org; s=20200322; h=Content-Transfer-Encoding:Content-Type:MIME-Version:Message-ID :In-Reply-To:Date:References:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=gyxyAMbRvkXYQBvMEQ21pDVBARp8nlDTE87SvMwIkl4=; b=c2JTRnp6evIADF2AlNXoy5YaMs kclX8FnjGz1Kl3qShyAy5HtxF7u1JMcpr1w+eP/msDVnCRf+e4xgwIDHX4Uw+Ct4agS2L6AG05W7y fL7Sd9ZoJwcCVw4pAEGRPvRiROKpXyrnivyiGbauZHQX9aoBjwhI1ox8Y/odKimh7n5g=; Original-Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by quimby.gnus.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1jOLOI-0007Hg-Ru for ding@gnus.org; Tue, 14 Apr 2020 15:14:17 +0200 Original-Received: by mail-wm1-x330.google.com with SMTP id e26so12925484wmk.5 for ; Tue, 14 Apr 2020 06:14:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :mime-version:content-transfer-encoding; bh=gyxyAMbRvkXYQBvMEQ21pDVBARp8nlDTE87SvMwIkl4=; b=rjihmXX2qKwKLe+9utd0mdc7GhOpXrBka34lWAaorgTpJpJUB55ABCmbLR2Ggh+N7l defK/tOxd4LksHta8rFrUApL6Zzx6O0sAeQLYneEJi+Bz4R/9X0d9njwuCbBWtRXNQC0 OmGDklzR4AExlcIoBTtR4+NYnj15dRwqxDBo7DqX1BkNRymBJ4Es9PZd0PbEgW2hRy2R CJuvVoGcDUfBR2/YHPynABMBubWqQhZqV1/lh72Cjq30/KwQGm6vYtHgk7NZby4Mvx+o l/IxMin+/EOFJXA/10vhB7Y/petWmboJ4/aKTzWdwX6IYDSC3HME8MVMQ09XR97OLzby PByg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:mime-version:content-transfer-encoding; bh=gyxyAMbRvkXYQBvMEQ21pDVBARp8nlDTE87SvMwIkl4=; b=JWfOejnm2nOHbjrO8/fln+Vo9EhgHrYzMPA1qr2bAguzroAFpFaTx7gvjQXSUj72V6 1S7hKBB4EOkZdFGHwqCsjO2HlJaOLyKmXGCp8StwXn+XLvWo5o7a4TF0tg2xSqDOuLUt uAG80ecORmfYf9jeQVl9e9Kg7PfBego9zVvRAlwoQe44IucqV/boGLVRm0tcPfYCZA3O J1eG/j9ulT6gilFVwD3s+C7PJ5P4g0Ql4Rf4QD/kCUObN2T8c/dA6Kj0RrEO7ERFMdCV df78coM3hwYcLx5NAlrvTgM4WYQdJ+lS2mGbuqo9L9VChRd52NbWd1+WIr2bmlYdzzSY Xx0A== X-Gm-Message-State: AGi0PuYUNDA9U5nrwlsWaFHTmAt9ZDypSfrN+yeAPWKos8yvdtMisUyp hVZbp4kmMQ70ETz9Rb1u45WWY5fr X-Google-Smtp-Source: APiQypLYi2KYjbA6O/0JdM62tX3B11ppcWa/nbh2fT5gRixZZ9NxIOIp0QjHutnZz31MLdNFuFbdGg== X-Received: by 2002:a1c:ded4:: with SMTP id v203mr23648900wmg.106.1586870053971; Tue, 14 Apr 2020 06:14:13 -0700 (PDT) Original-Received: from rpluim-mac ([2a01:e34:ecfc:a860:f1a6:22e0:cfda:c9f2]) by smtp.gmail.com with ESMTPSA id s24sm17516476wmj.28.2020.04.14.06.14.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2020 06:14:12 -0700 (PDT) In-Reply-To: (Robert Pluim's message of "Sat, 11 Apr 2020 18:53:38 +0200") List-ID: Precedence: bulk Xref: news.gmane.io gmane.emacs.gnus.general:89088 gmane.emacs.devel:246942 Archived-At: >>>>> On Sat, 11 Apr 2020 18:53:38 +0200, Robert Pluim s= aid: Robert> OK, so it=CA=BCs the DNS. The libravatar method does a bunch of= DNS Robert> queries, and those can be slow, and they're done for every arti= cle. Robert> I guess we need to see if we can make those DNS lookups asynchr= onous. The following does at least make rendering of the article complete straight away, although you might end up waiting a little longer for the gravatar to actually appear. I=CA=BCm assuming your emacs has thread support. (the inhibit-redisplay is there because otherwise this crashes on macOS, where apparently you can only call certain OS window system functions from the main thread). diff --git a/lisp/image/gravatar.el b/lisp/image/gravatar.el index ff59a72ac8..b9ad16bb28 100644 --- a/lisp/image/gravatar.el +++ b/lisp/image/gravatar.el @@ -149,7 +149,7 @@ gravatar--service-libravatar (dolist (record '(("_avatars-sec" . "https") ("_avatars" . "http"))) (let* ((query (concat (car record) "._tcp." domain)) - (result (dns-query query 'SRV))) + (result (dns-query-cached query 'SRV))) (when result (throw 'found (format "%s://%s/avatar" (cdr record) @@ -189,17 +189,41 @@ gravatar-get-data (search-forward "\n\n" nil t) (buffer-substring (point) (point-max))))) =20 -;;;###autoload -(defun gravatar-retrieve (mail-address callback &optional cbargs) +(defvar gravatar-retrieve-params nil) +(defvar gravatar-thread nil) +(defvar gravatar-exit-thread nil) +(defvar gravatar-mutex nil) +(defvar gravatar-cond-var nil) + +(defun gravatar-retrieve-thread () "Asynchronously retrieve a gravatar for MAIL-ADDRESS. When finished, call CALLBACK as (apply CALLBACK GRAVATAR CBARGS), where GRAVATAR is either an image descriptor, or the symbol `error' if the retrieval failed." - (let ((url (gravatar-build-url mail-address))) - (if (url-cache-expired url gravatar-cache-ttl) - (url-retrieve url #'gravatar-retrieved (list callback cbargs) t) - (with-current-buffer (url-fetch-from-cache url) - (gravatar-retrieved () callback cbargs))))) + (while (not gravatar-exit-thread) + (with-mutex gravatar-mutex + (condition-wait gravatar-cond-var) + (let ((inhibit-redisplay t) + (mail-address (nth 0 gravatar-retrieve-params)) + (callback (nth 1 gravatar-retrieve-params)) + (cbargs (nth 2 gravatar-retrieve-params))) + (let ((url (gravatar-build-url mail-address))) + (if (url-cache-expired url gravatar-cache-ttl) + (url-retrieve url #'gravatar-retrieved (list callback cbargs= ) t) + (with-current-buffer (url-fetch-from-cache url) + (gravatar-retrieved () callback cbargs))))) + (thread-yield)))) + +;;;###autoload +(defun gravatar-retrieve (mail-address callback &optional cbargs) + (unless gravatar-thread + (setq gravatar-mutex (make-mutex) + gravatar-cond-var (make-condition-variable gravatar-mutex) + gravatar-thread (make-thread #'gravatar-retrieve-thread))) + (with-mutex gravatar-mutex + (setq gravatar-retrieve-params + (list mail-address callback cbargs)) + (condition-notify gravatar-cond-var))) =20 ;;;###autoload (defun gravatar-retrieve-synchronously (mail-address)