On Fri, Jun 09, 2006 at 05:38:33PM -0400, Peter Memishian wrote:
> 
>  > Of course;  I think my example still stands, though.  For example:
>  > 
>  >    int dropped_ref = 0;
>  > 
>  >    mutex_enter(&obj->mutex);
>  >    if (--obj->ref == 0)
>  >            dropped_ref = 1;
>  >    mutex_exit(&obj->mutex);
>  >            ------------------------->
>  >                                            mutex_enter(&global);
>  >                                            obj = obj_lookup_and_remove();
>  >                                            mutex_exit(&global);
>  > 
>  >                                            mutex_enter(&obj->mutex);
>  >                                            while (obj->ref > 0)
>  >                                                    cv_wait(&obj->cv,
>  >                                                        &obj->mutex);
>  >                                            mutex_exit(&obj->mutex);
>  >                                            kmem_free(obj);
>  >            <-------------------------
>  >    if (dropped_ref)
>  >            cv_signal(&obj->cv);
>  > 
>  > If the signal was underneath the lock, there wouldn't be a race.
> 
> But the above code is wrong for a more fundamental reason: it's never OK
> to access fields of a structure after you've dropped your reference to it.
> (And indeed, adding mutex_enter()/mutex_exit() around the cv_signal()
> would do nothing to improve the correctness of the above code ;-)

True.  I'll accept that my example is actually of a different problem. =]

> I assert that from a correctness standpoint, it never matters if you hold
> the lock while doing a cv_signal() or cv_broadcast().  I agree that there
> may be performance issues, but it would be nice to see some hard data
> since (as previously covered) I can see advantages to not holding the lock
> as well.

True;  it seems like a point which can be argued either way.  It shouldn't be
too hard to collect data with dtrace(1M).

Cheers,
- jonathan

-- 
Jonathan Adams, Solaris Kernel Development

Reply via email to