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