Date: Sun, 14 Oct 2012 10:04:53 +0100 From: David Laight <da...@l8s.co.uk>
Hmmm.... IIRC solaris kernel cv_init() is actually a malloc, so cv_destroy() is a free() - and thus mandatory. OTOH doesn't NetBSD's cv_init() just initialise the memory, making cv_destroy() not strictly necessary? In both illumos and NetBSD, cv_init only initializes the memory. In illumos, cv_destroy is actually always a no-op (modulo consistency checks), whereas in NetBSD, it has nontrivial effects when LOCKDEBUG or DIAGNOSTIC is enabled. I have not checked the older OpenSolaris code, but I assume it probably hasn't changed much in illumos. For reference, the illumos code I'm reading is at <https://github.com/joyent/illumos-joyent/blob/090f8e7a981e84e43138990d5d8e06fe26bc09c4/usr/src/uts/common/os/condvar.c>. These will be a lot of implementations of 'cv' where cv_wait() has to look at the cv after being woken. Correct, hence the question about tastelessness. For example, the rump implementation of kernel condvars does this. It would be more involved to make the idiom work for rump, perhaps by putting the reference-counting scheme I described into the implementation of librumpuser condvars; and perhaps this would not be worth the trouble.