about summary refs log tree commit homepage
path: root/lib/PublicInbox/SearchThread.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-10-13 03:59:03 +0000
committerEric Wong <e@80x24.org>2016-10-13 04:01:18 +0000
commitf2b07568e623c2a0aff4d0135617a26c887d2755 (patch)
tree3b36f513f6ee214ec1e7857f8834f838ba607030 /lib/PublicInbox/SearchThread.pm
parente76543b68aa384f328b19673681b5595f439376c (diff)
downloadpublic-inbox-f2b07568e623c2a0aff4d0135617a26c887d2755.tar.gz
The ordering change in add_child is critical if $self == $parent
as the {children} hash was lost before this change.

has_descendent can be simplified by walking upwards from the child
instead of downwards from the parent.

This fixes threading regressions introduced in
commit 30100c46326e2eac275e0af13116636701d2537e
("thread: use hash + array instead of hand-rolled linked list")
Diffstat (limited to 'lib/PublicInbox/SearchThread.pm')
-rw-r--r--lib/PublicInbox/SearchThread.pm16
1 files changed, 5 insertions, 11 deletions
diff --git a/lib/PublicInbox/SearchThread.pm b/lib/PublicInbox/SearchThread.pm
index c6bd999c..24a56d2d 100644
--- a/lib/PublicInbox/SearchThread.pm
+++ b/lib/PublicInbox/SearchThread.pm
@@ -104,27 +104,21 @@ sub add_child {
           if $self == $child;
 
         my $cid = $child->{id};
-        $self->{children}->{$cid} = $child;
 
         # reparenting:
         if (defined(my $parent = $child->{parent})) {
                 delete $parent->{children}->{$cid};
         }
 
+        $self->{children}->{$cid} = $child;
         $child->{parent} = $self;
 }
 
 sub has_descendent {
-        my ($cur, $child) = @_;
-        my %seen;
-        my @q = ($cur->{parent} || $cur);
-
-        while (defined($cur = shift @q)) {
-                return 1 if $cur == $child;
-
-                if (!$seen{$cur}++) {
-                        push @q, values %{$cur->{children}};
-                }
+        my ($self, $child) = @_;
+        while ($child) {
+                return 1 if $self == $child;
+                $child = $child->{parent};
         }
         0;
 }