diff options
author | Eric Wong <e@80x24.org> | 2016-10-13 03:59:03 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-10-13 04:01:18 +0000 |
commit | f2b07568e623c2a0aff4d0135617a26c887d2755 (patch) | |
tree | 3b36f513f6ee214ec1e7857f8834f838ba607030 /lib/PublicInbox | |
parent | e76543b68aa384f328b19673681b5595f439376c (diff) | |
download | public-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')
-rw-r--r-- | lib/PublicInbox/SearchThread.pm | 16 |
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; } |