https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=137145

--- Comment #10 from Andriy Gapon <a...@freebsd.org> ---
(In reply to Gleb Smirnoff from comment #9)
You are right when the scenario is going from one owner to more.
But there is a scenario of multiple owners, some dropping their reference and
some just getting it.

For example, let's start with refcnt of 2 and three threads: T1, T2, T3.
T1 and T2 are getting a new reference while T3 is dropping its reference.
There is also another owner, Tx, that just keeps its reference.

1. T1 reads refcnt, sees 2;
2. T3 decrements refcnt to 1
3. T2 reads refctnt see 1;
4. T2 proceeds to non-atomic *refcnt += 1 and reads refcnt as 1 again;
5. T1 proceeds to atomic_add_int and increments refcnt to 2;
6. T2 sets refcnt to 2 as well (based on step 4);

In the end, we have 3 owners (T1, T2, Tx) but the refcnt is 2.

-- 
You are receiving this mail because:
You are the assignee for the bug.

Reply via email to