Add stupid mechanism to break cycles in reference graphs. This
authorChris Hanson <org/chris-hanson/cph>
Mon, 23 Feb 1998 05:37:47 +0000 (05:37 +0000)
committerChris Hanson <org/chris-hanson/cph>
Mon, 23 Feb 1998 05:37:47 +0000 (05:37 +0000)
doesn't try to do a good job -- it just breaks them at the point where
they are discovered.  After having used this program for over a year,
the cycle I just ran across was the first, out of perhaps 100,000
messages or more, so this is an unusual occurrence.

v7/src/edwin/nntp.scm

index 255f5d456bde268107748a67eb0b00162f32553f..b5054eb3bf6b3e0091778056abaab9d07ecfbcde 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Id: nntp.scm,v 1.17 1997/11/13 08:01:59 cph Exp $
+;;;    $Id: nntp.scm,v 1.18 1998/02/23 05:37:47 cph Exp $
 ;;;
-;;;    Copyright (c) 1995-97 Massachusetts Institute of Technology
+;;;    Copyright (c) 1995-98 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
        ((NONE)
         (hash-table/put! table header 'PENDING)
         (let ((result
-               (reduce unionq
-                       '()
-                       (let ((headers (step header)))
-                         (cons headers (map loop headers))))))
+               (reduce
+                unionq
+                '()
+                (let ((headers (step header)))
+                  (cons headers
+                        (map (lambda (header*)
+                               (let ((result (loop header*)))
+                                 (if (eq? 'CYCLE result)
+                                     (begin
+                                       (if (eq? step news-header:followups)
+                                           (unlink-headers! header header*)
+                                           (unlink-headers! header* header))
+                                       '())
+                                     result)))
+                             headers))))))
           (hash-table/put! table header result)
           result))
        ((PENDING)
-        (error "Cycle detected in header graph:" header))
+        ;;(error "Cycle detected in header graph:" header)
+        'CYCLE)
        (else cache)))))
 
 (define (reset-caches! tables header)