Remove all spinlocks
authorKevin Klues <klueska@cs.berkeley.edu>
Mon, 24 Aug 2015 21:42:57 +0000 (14:42 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 2 Sep 2015 17:50:05 +0000 (13:50 -0400)
commit0378a657904676ce4cb2676b7bb5bbb1c1ade67e
treecfd1953ae5c6fd50f5608bed0da2ae6f5ca411c6
parent763c4ba240782e2e95c5dd7a0cff36d1629c4f6a
Remove all spinlocks

The spinlock in the dtls struct is unnecessary, because the only field
it matters for is the refcount, which we can increment and decrement
using atomic ops.  The setting of the valid field to false (which was
previously protected by the lock) is inherently racy when used to decide
whether a destructor function should be run. Removing the lock when
setting this value doesn't make it any less racy. As the comment
suggests though, any reasonable usage of DTLS should not be deleting a
key until it knows that all threads have ran their destructors anyway
(or at least aren't currently in the process of running their
destructors).

Moreover the global __dtls_lock is unnecessary, as it only protects
access to the slab allocator functions, which have pdr locks
internally.`

As part of this, we are now able to move the atomic decrement into our
call for __maybe_free_dlts_key(), fixing a race condition on reading the
keys refcount in the process. We use a __sync_add_and_fetch instead of a
__sync_fetch_and_add to grab the new value atomically, before comparing
it to 0.
user/parlib/dtls.c