RootTalk


ROOT Discussion Forums

segfault after remove and delete TChain friend

Discuss installing and running ROOT here. Please post bug reports here.

Moderator: rootdev

segfault after remove and delete TChain friend

Unread postby benloer » Fri Aug 24, 2012 20:58

Hi all,

The following code block will cause a segfault (root 5.27 and gcc 4.1.2):

Code: Select all
TChain* c1 = new TChain("data");
c1->Add("data*.root");
TChain* c2 = new TChain("cuts");
c2->Add("cuts*.root");

c1->AddFriend(c2);
c1->Draw("varincutstree");

c1->RemoveFriend(c2);
delete c2;

c1->SetBranchStatus("*",0);


It seems c1 still has some reference to the branches in c2 even after the friend is removed (and it _is_ removed from the ListOfFriends).

Until a bugfix happens, is there a reasonably convenient workaround? The use case is that my dataset is broken up into trees with interesting data and trees that are only really used to generate cuts. So I want to temporarily add the cut trees as friends just to generate a TEntryList, then get rid of them.

Thanks,
~Ben
benloer
 
Posts: 47
Joined: Tue Feb 13, 2007 0:24

Re: segfault after remove and delete TChain friend

Unread postby benloer » Fri Aug 24, 2012 22:23

The following seems to get around the problem, by removing the friend from each of the chain's subtrees, at least in my case:
Code: Select all
Long64_t* offsets = parent->GetTreeOffset();
Long64_t entry = 0;
for(Int_t treenum=0; treenum < parent->GetNTrees(); ++treenum){
  entry += offsets[treenum];
  parent->LoadTree(entry);
  TTree* tree = parent->GetTree();
  tree->RemoveFriend(friend);
}


Not sure if it will work in all cases, but it would be nice to add this step to TChain::RemoveFriend.

~Ben
benloer
 
Posts: 47
Joined: Tue Feb 13, 2007 0:24

Re: segfault after remove and delete TChain friend

Unread postby pcanal » Wed Sep 19, 2012 21:20

Hi Ben,

This is corrected in the trunk (revision 46069) and in the v5-34 patch branch (v5.34/02 will be released at the end of the week and will include this fix).

Apriori to somewhat work around the problem you should just need:
Code: Select all
parent->GetTree()->RemoveFriend( friendChain->GetTree() );


Cheers,
Philippe.
pcanal
 
Posts: 6147
Joined: Wed Aug 27, 2003 14:22
Location: Fermilab


Return to ROOT Support

Who is online

Users browsing this forum: Google [Bot], Google Feedfetcher and 3 guests