From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS8972 85.25.103.0/24 X-Spam-Status: No, score=-2.6 required=3.0 tests=AWL,BAYES_00,RCVD_IN_XBL, SPF_FAIL,SPF_HELO_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (atlantic850.dedicatedpanel.com [85.25.103.69]) by dcvr.yhbt.net (Postfix) with ESMTP id 54B2E215F7 for ; Wed, 12 Oct 2016 23:07:25 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH 2/2] thread: fix parent/child relationships Date: Wed, 12 Oct 2016 23:07:19 +0000 Message-Id: <20161012230719.23404-2-e@80x24.org> In-Reply-To: <20161012230719.23404-1-e@80x24.org> References: <20161012230719.23404-1-e@80x24.org> List-Id: The ordering change in add_child is critical if $self == $parent, and has_descendent can be simplified by walking upwards from the child instead of downwards from the parent. This fixes a threading regression introduced in commit 30100c46326e2eac275e0af13116636701d2537e ("thread: use hash + array instead of hand-rolled linked list") --- lib/PublicInbox/SearchThread.pm | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/lib/PublicInbox/SearchThread.pm b/lib/PublicInbox/SearchThread.pm index c6bd999..24a56d2 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; } -- EW