- Use sleepqs directly, rather than using condition variables and
separate wait queues / strutures. By doing this, and using the
standard mechanism for keeping sleepqs sorted by priority, we
acn ensure that the highest priority waiters will be awakened,
rather than naively awakening in FIFO order.
- As part of the data structure re-organization, struct lwp gains
"l_futex" (the futex an LWP is blocked on) and "l_futex_wakesel"
(the futex wake selector bitset) fields (and loses l___rsvd1).
Plese note the special locking considerations for these fields
documented in the comments.
- Add the notion of a "futex class". This is prep work for eventually
supporting the FUTEX_*_PI operations, as well as some future NetBSD
extensions to the futex interface.
- Add a preliminary implementation of the first of those NetBSD extensions,
FUTEX_NETBSD_RW_WAIT and FUTEX_NETBSD_RW_HANDOFF. These are designed
to implement reader/writer locks with direct-handoff to the correct
priority thread(s) (real-time read-waiters need to have priority over
non-real-time write-waiters). NOTE: this is currently disabled due to
a mysterious panic that haasn't yet been tracked down.
- Add some SDT probes to aid in debugging.
The comment "execute the commands" had once been correct but not
anymore. Since a few years, not only the commands of the .BEGIN and
.END nodes are executed, instead the nodes are made as usual, including
their dependencies.
audio_unlink() must be called without exlock held (and
audio_mixer_destroy() must be called with exlock held).
This makes unplugging during playing/recording work (again).
Reported by Julian Coleman on current-users:
http://mail-index.netbsd.org/current-users/2020/12/10/msg040050.html
A race between child and parent means that we cannot
guarantee whether all child output is seen before we call
JobClosePipes, thus intervening debug output can appear
before or after the last child output.
Now that the parsing of the directives is unified and strict, there is
no need anymore for the dispatched functions to check for unknown
directives. These functions don't even get the information to decide
that since this decision is already done.
Since a line is not an iterator and since the expression *line typically
means "the current element", not "the first character", replacing *line
with line[0] more directly expresses the idea of accessing the first
character of a string.