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