Follow these steps in the code path to signal the condition:
Acquire the mutex guarding the condition.
Set the condition.
Signal the blocked thread with cv_broadcast(9F).
Release the mutex.
The following example uses a busy flag along with mutex and condition variables to force the read(9E) routine to wait until the device is no longer busy before starting a transfer.
static int
xxread(dev_t dev, struct uio *uiop, cred_t *credp)
{
struct xxstate *xsp;
/* ... */
mutex_enter(&xsp->mu);
while (xsp->busy)
cv_wait(&xsp->cv, &xsp->mu);
xsp->busy = 1;
mutex_exit(&xsp->mu);
/* perform the data access */
}
static uint_t
xxintr(caddr_t arg)
{
struct xxstate *xsp = (struct xxstate *)arg;
mutex_enter(&xsp->mu);
xsp->busy = 0;
cv_broadcast(&xsp->cv);
mutex_exit(&xsp->mu);
}