On 8/06/2012 2:46 a.m., Alex Rousskov wrote:
On 06/06/2012 07:25 PM, Amos Jeffries wrote:
+ if (delta< head->best)
+ head->best = delta;
+ if (delta> head->worst)
+ head->worst = delta;
+ head->summ += delta;
+ head->count++;
+ head->overheads += get_tick() - stopped_;
The above XProfilerNode::stop() code is not thread-safe because multiple
threads may update the same "head" and you are not using atomics for
*head members.
Ok, for now this is the second major TODO.
I'm torn between GCC __sync_* and C++11 atomic_* types.
There is maybe a wrapper compat layer needed temporarily I think.
Since SMP Squid already uses GCC __sync_* primitives and has the
corresponding wrappers, consider reusing them for your project. See
ipc/AtomicWord.h for a starting point.
The existing wrappers can be adjusted to use C++11 atomic_* types when
those are provided by the build environment, but that sounds like a very
different project to me.
The __sync seem to needs a lot of individual data entry locks and
un-locks for this.
For a simpler patch I've gone with one spinlocks on the global
variables, and one on each linked-list entry of the stats accuumulation
tree. Making it atomic change to each bunch of details as a small group
rather than multiple sync and unlock operations. They are always
accessed for write as a group. Just means GCC-4.4 or later to build the
profiler.
Amos