1.0.42.19: make SB-CONCURRENCY more GC friendly
authorNikodemus Siivola <nikodemus@random-state.net>
Wed, 1 Sep 2010 16:57:12 +0000 (16:57 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Wed, 1 Sep 2010 16:57:12 +0000 (16:57 +0000)
 * Patch by "3b", lp#628098.

 * Break chains of detached nodes, so conservativism won't kill us.

contrib/sb-concurrency/queue.lisp
version.lisp-expr

index a902785..5fa7007 100644 (file)
@@ -80,11 +80,19 @@ and secondary value."
                       (go :continue)))
                 (when (eq head (sb-ext:compare-and-swap (queue-head queue)
                                                         head first-node-prev))
-                  ;; This assignment is not present in the paper, but is
-                  ;; equivalent to the free(head.ptr) call there: it unlinks
-                  ;; the HEAD from the queue -- the code in the paper leaves
-                  ;; the dangling pointer in place.
-                  (setf (node-next first-node-prev) nil)
+                  ;; These assignment is not present in the paper, but are
+                  ;; equivalent to the free(head.ptr) call there.
+                  ;;
+                  ;; First we unlink the HEAD from the queue -- the code in
+                  ;; the paper leaves the dangling pointer in place.
+                  ;;
+                  ;; Then we NIL out the slots in HEAD to help the GC,
+                  ;; otherwise conservativism might lead to massive chains of
+                  ;; nodes being retained.
+                  (setf (node-next first-node-prev) nil
+                        (node-prev head) nil
+                        (node-next head) nil
+                        (node-value head) nil)
                   (return-from dequeue (values val t))))
                ((eq tail head)
                 (return-from dequeue (values nil nil)))
index 52b3a7d..7a89c31 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.42.18"
+"1.0.42.19"