emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: url.el blocks Gnus+nnrss


From: Stefan Monnier
Subject: Re: url.el blocks Gnus+nnrss
Date: Thu, 13 Jan 2005 09:35:15 -0500
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/21.3.50 (gnu/linux)

> Several people reported that Gnus hangs if they subscribe to
> nnrss groups.  nnrss is a back end which uses the url ELisp
> package by default and enables to read rss feeds as if they were
> newsgroups.

I've myself been using the patch below for a while now (it basically does
the same as yours, except it hoists the get-buffer-process outside the loop
and it removes the timeout since it shouldn't be needed now that Emacs knows
what we're waiting for).

I've just installed it.


        Stefan


--- orig/lisp/url/url.el
+++ mod/lisp/url/url.el
@@ -1,6 +1,7 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 
-;; Copyright (c) 1996,1997,1998,1999,2001,2004  Free Software Foundation, Inc.
+;; Copyright (c) 1996, 1997, 1998, 1999, 2001, 2004, 2005
+;;           Free Software Foundation, Inc.
 
 ;; Author: Bill Perry <address@hidden>
 ;; Keywords: comm, data, processes, hypermedia
@@ -169,26 +169,24 @@
                              (url-debug 'retrieval "Synchronous fetching done 
(%S)" (current-buffer))
                              (setq retrieval-done t
                                    asynch-buffer (current-buffer)))))
-    (if (not asynch-buffer)
+    (let ((proc (and asynch-buffer (get-buffer-process asynch-buffer))))
+      (if (null proc)
        ;; We do not need to do anything, it was a mailto or something
        ;; similar that takes processing completely outside of the URL
        ;; package.
        nil
       (while (not retrieval-done)
        (url-debug 'retrieval "Spinning in url-retrieve-synchronously: %S (%S)"
                   retrieval-done asynch-buffer)
-       ;; Quoth Stef:
-       ;; It turns out that the problem seems to be that the (sit-for
-       ;; 0.1) below doesn't actually process the data: instead it
-       ;; returns immediately because there is keyboard input
-       ;; waiting, so we end up spinning endlessly waiting for the
-       ;; process to finish while not letting it finish.
-
-       ;; However, raman claims that it blocks Emacs with Emacspeak
-       ;; for unexplained reasons.  Put back for his benefit until
-       ;; someone can understand it.
-       ;; (sleep-for 0.1)
-       (sit-for 0.1))
+         ;; We used to use `sit-for' here, but in some cases it wouldn't
+         ;; work because apparently pending keyboard input would always
+         ;; interrupt it before it got a chance to handle process input.
+         ;; `sleep-for' was tried but it lead to other forms of
+         ;; hanging.  --Stef
+         (unless (accept-process-output proc)
+           ;; accept-process-output returned nil, maybe because the process
+           ;; exited (and may have been replaced with another).
+           (setq proc (get-buffer-process asynch-buffer)))))
       asynch-buffer)))
 
 (defun url-mm-callback (&rest ignored)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]