RE: [ROOT] Request for iteration on TSystemDirectory

From: Philippe Canal (pcanal@fnal.gov)
Date: Mon Mar 12 2001 - 22:50:25 MET


Hi Valery,

TFileSet::TFileSet current has to receveive a first argument
containing a '/'.
I.e. your example would works with
   TString name("./ATLAS")
   TFileSet fs(name)

This is due to the lines:

    if (!setname) {setname = strrchr(name,'/')+1;}
    if (setname) SetName(setname);
    else SetName(name);

The test on the second line is incorrect because the
first line sets 'setname' to 1 when there are no '/'.

Philippe.

A possible patch is:


cvs diff star/src/TFileSet.cxx
Index: star/src/TFileSet.cxx
===================================================================
RCS file: /user/cvs/root/star/src/TFileSet.cxx,v
retrieving revision 1.2
diff -r1.2 TFileSet.cxx
63c63,66
<     if (!setname) {setname = strrchr(name,'/')+1;}
---
>     if (!setname) {
>        setname = strrchr(name,'/');
>        if (setname) setname++;
>     }



-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Valeri Fine (Faine)
Sent: Monday, March 12, 2001 3:07 PM
To: Christian Holm Christensen
Cc: roottalk@pcroot.cern.ch
Subject: Re: [ROOT] Request for iteration on TSystemDirectory



> >
> > Uh. When I do
> >
> >   root> gSystem->Load("libStar.so");
> >   root> TString home("/home/group/user")
> >   root> TFileSet myHome(home)
> >
> > it hangs! That is, nothing happens. ROOT/CINT doen't do anything (I
> > let it sit there for at least ~30 minutes). Even if I do
> >
> >   root> TFileSet myhome("/home/group/user", "foo", kFALSE)
> >
> > nothing (and I really mean nothing!) happens. What's up?
> >
>
> I still have no 3.00.06 locally. Mean time I tried 3.00.05
> and found no problem:

 I've tried this example at CERN under ROOT 3.00.06 and found:

Starting program:
/afs/cern.ch/na49/library.4/ROOT/new/i386_redhat60/root//bin/root.exe -b
  *******************************************
  *                                         *
  *        W E L C O M E  to  R O O T       *
  *                                         *
  *   Version   3.00/06     12 March 2001   *
  *                                         *
  *  You are welcome to visit our Web site  *
  *          http://root.cern.ch            *
  *                                         *
  *******************************************

Compiled with thread support.

CINT/ROOT C/C++ Interpreter version 5.14.79, Feb 24 2001
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0] gSystem->Load("libStar")
root [1] TString name("ATLAS")
root [2] TFileSet fs(name)

Program received signal SIGSEGV, Segmentation fault.
0x400fde3b in TString::operator= ()
   from
/afs/cern.ch/na49/library.4/ROOT/new/i386_redhat60/root//lib/libCore.so
(gdb) where 5
#0  0x400fde3b in TString::operator= ()
   from
/afs/cern.ch/na49/library.4/ROOT/new/i386_redhat60/root//lib/libCore.so
#1  0x400ed130 in TNamed::SetName ()
   from
/afs/cern.ch/na49/library.4/ROOT/new/i386_redhat60/root//lib/libCore.so
#2  0x40cfd21e in TFileSet::TFileSet ()
   from
/afs/cern.ch/na49/library.4/ROOT/new/i386_redhat60/root//lib/libStar.so
#3  0x40d344dc in G__TFileSet_TFileSet_1_0__FP8G__valuePCcP8G__parami ()
   from
/afs/cern.ch/na49/library.4/ROOT/new/i386_redhat60/root//lib/libStar.so
#4  0x404722f3 in G__call_cppfunc ()
   from
/afs/cern.ch/na49/library.4/ROOT/new/i386_redhat60/root//lib/libCint.so
(More stack frames follow...)
(gdb)

           Any idea ?

>
> [rcf] ~/public/expert/root > root.exe -b
>   *******************************************
>   *                                         *
>   *                                         *
>   *   Version   3.00/05      5 March 2001   *
>   *                                         *
>   *                                         *
>   *******************************************
> root [0] gSystem->Load("libStar")
> (int)0
> root [1] TString a("~/public/expert")
> root [2] TFileSet fs(a)
> root [3] fs.ls(8)
>   0 - expert    directory
>   1 - expert/Jeff       directory
>   2 - expert/Jeff/SavePrim.C    file
>   2 - expert/Jeff/myTestFile.C  file
>   1 - expert/C++Fun     directory
>
>
> How deep is your ("/home/group/user") ?
> Are you sure it is not running around the globe follow the symbolic
> links for example.It may take a while I think.
> I have found  one has to protect this class against of "black hole deep"
> directories.
>
>  Some thing like this:
>
> Replace ctor:
>
> TFileSet(const TString &dirname,const Char_t *setname,Bool_t expand)
>
> with
>
> TFileSet(const TString &dirname,const Char_t *setname,Bool_t expand, Int_t
maxDeep=10)
> {
>       if (!maxDeep) return;
>      . . .
>
>
> and  replace:
>
>          Add(new TFileSet(nextdir,name,kFALSE));
> with
>          Add(new TFileSet(nextdir,name,kFALSE,maxDeep-1));
>
>  Thank you,
>                                         Valeri
>
>



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:39 MET