Hi Walter, I have added a LOCKGUARD in the TSeqCollection::QSort functions. About Form, as you say, this is a bit more complex. One could also add a LOCKGUARD in FORM for the current value of bfree, but this would add a non-negligible performance penalty for many applications not using Threads (Root is compiled by default with the Thread option). A clean solution requires more thinking. Thanks for sending these comments. Rene Brun "Walter F.J. Mueller" wrote: > > Dear ROOTers, using 3.05.05 > > there has been many times on this list and otherwise discussions on > whether ROOT is thread-safe (or under what precautions it might be) > and what additional measures (like locks) have to be added to achieve > thread-safety. > > More by accident I found two central functions in ROOT which are as > far as I an see currently thread-unsafe and consequently render > everything using them also thread-unsafe. > > Case 1: > > The two TSeqCollection::QSort() methods declare local variables as > 'static', the comment states "to save stack space". This method is > used to implement Sort() in TClonesArray, TObjArray, and > TOrdCollection. > > When the Sort() method is called for these classes in two different > threads the result can to be corrupted. > > Case 2: > > The usage of the Form() global method provided by TString is > inherently thread-unsafe. It relies on a small and predictable > usage time of the char* pointer returned by this method, it has > to be smaller than the time it takes to re-fill the circular buffer. > > If Form() is used in two threads this can't be guaranteed anymore. > A context switch right after a Form() call followed by Form() > calls in another thread may render the pointer invalid before it > is used. > > A simple find $ROOTSYS -name "*.cxx" | xargs egrep -l "Form\(" | wc > shows that Form() is used in 56 source files, so quite a few classes > are affected. > > Case 1 is trivial to cure, with todays memory sizes this hack surely > isn't a need. Case 2 can as far as I see only be cured by changing > the interface, e.g. eliminating the circular buffer and returning a > string or TString object by value. > > Too me it seems that there is quite a way to go before ROOT can be > considered thread-safe, and that a thorough code review is probably > one of things to be done on this way. > > With best regards, > > Walter
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET