From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adam Porter Subject: Re: Asynchronous org-agenda-redo Date: Fri, 13 Dec 2019 22:59:00 -0600 Message-ID: <878snfsdt7.fsf@alphapapa.net> References: <87k172ot2m.fsf@yantar92-laptop.i-did-not-set--mail-host-address--so-tickle-me> <87pngtsppt.fsf@alphapapa.net> <87o8wda6nv.fsf@yantar92-laptop.i-did-not-set--mail-host-address--so-tickle-me> <87h824sos5.fsf@alphapapa.net> <87wob0fwsg.fsf@yantar92-laptop.i-did-not-set--mail-host-address--so-tickle-me> <87immk8szl.fsf@yantar92-laptop.i-did-not-set--mail-host-address--so-tickle-me> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:35676) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ifzWJ-0006mH-VF for emacs-orgmode@gnu.org; Fri, 13 Dec 2019 23:59:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ifzWI-0000QZ-SK for emacs-orgmode@gnu.org; Fri, 13 Dec 2019 23:59:11 -0500 Received: from 195-159-176-226.customer.powertech.no ([195.159.176.226]:60008 helo=blaine.gmane.org) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ifzWI-0000Kp-Hq for emacs-orgmode@gnu.org; Fri, 13 Dec 2019 23:59:10 -0500 Received: from list by blaine.gmane.org with local (Exim 4.89) (envelope-from ) id 1ifzWG-0008Ns-5P for emacs-orgmode@gnu.org; Sat, 14 Dec 2019 05:59:08 +0100 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: emacs-orgmode@gnu.org Ihor Radchenko writes: >>> Asynchronous code is not faster; it's generally slower because of >>> yielding and synchronization. > >> Anyway, I will try to throw yields into agenda code just to check how >> bad the performance can degrade. > > With the following code, org-agenda-redo runs for 21 second on my > system, while without threads it is 16 seconds. However, emacs remains > responsive during rebuilding agenda! > > (define-advice org-agenda-redo (:around (oldfun &optional all) make-async) > (make-thread (lambda () (funcall oldfun all)) "org-agenda-redo")) > (define-advice org-agenda-skip-eval (:around (oldfun form) make-async) > (thread-join (make-thread (lambda () (funcall oldfun form)) "org-agenda-skip-eval"))) That's a very elegant way to add the threading! The performance penalty is noticeable, but the tradeoff could be worth it in some cases, like a background agenda refresh on a timer, or after a "remote" edit. I can imagine an org-agenda-refresh-async command that would add that advice and remove them in an unwind-protect. > The problem, of course, is that touching agenda buffer and org buffers > may be risky while org-agenda-redo is running. > Wondering if it is possible to block user commands during that time. The first thing that comes to mind is to set buffer-read-only on each buffer before it is scanned, and unset it when done with a buffer. That might not be doable with advice.