On 6/7/19 3:58 PM, Jan Hubicka wrote: >> >> Because I removed hist->hvalue.counters[2] where we stored total number of >> executions. >> It's back again so that _atomic suffix version makes sense again. > > OK and we do not care about race conditions on the other two counters?
We do care, but one can't probably implement that without a locking of the critical section: 117 static inline void 118 __gcov_one_value_profiler_body (gcov_type *counters, gcov_type value, 119 int use_atomic) 120 { 121 if (value == counters[1]) 122 counters[2]++; 123 else if (counters[2] == 0) 124 { 125 counters[2] = 1; 126 counters[1] = value; 127 } 128 else 129 counters[2]--; Here you operate with 2 values which can change during a parallel execution. >> >> After we discussed that I decided to live with all counters in memory. >> Reason is that >> in write_one_data we would have to allocate temporary buffers and fill up >> them here: >> >> 304 tag = gcov_read_unsigned (); >> 305 length = gcov_read_unsigned (); >> 306 if (tag != GCOV_TAG_FOR_COUNTER (t_ix) >> 307 || length != GCOV_TAG_COUNTER_LENGTH (ci_ptr->num)) >> 308 goto read_mismatch; >> 309 (*merge) (ci_ptr->values, ci_ptr->num); >> 310 ci_ptr++; >> >> It would be quite nasty and I would like to mitigate libgcov profile crashes. > > Hmm, I see, if code was organized to directly write the output, it would > be easier. I guess it is not overly important. > > Patch is OK Thanks for the approval. Martin > Honza >