fix panic for large writes in non-blocking mode

This commit is contained in:
Cameron Grant 1999-11-22 21:16:01 +00:00
parent ab473c8a50
commit 54671c035c
1 changed files with 6 additions and 3 deletions

View File

@ -273,7 +273,10 @@ chn_write(pcm_channel *c, struct uio *buf)
chn_dmaupdate(c);
splx(s);
if (b->fl < DMA_ALIGN_THRESHOLD) {
if (c->flags & CHN_F_NBIO) break;
if (c->flags & CHN_F_NBIO) {
ret = -1;
break;
}
timeout = (buf->uio_resid >= b->dl)? hz : 1;
ret = tsleep(b, PRIBIO | PCATCH, "pcmwr", timeout);
if (ret == EINTR) chn_abort(c);
@ -283,7 +286,7 @@ chn_write(pcm_channel *c, struct uio *buf)
}
/* ensure we always have a whole number of samples */
l = min(b->fl, b->bufsize - b->fp) & ~a;
if (l == 0) break;
if (l == 0) continue;
w = c->feeder->feed(c->feeder, c, b->buf + b->fp, l, buf);
if (w == 0) panic("no feed");
s = spltty();
@ -300,7 +303,7 @@ chn_write(pcm_channel *c, struct uio *buf)
c->smegcnt += l;
}
c->flags &= ~CHN_F_WRITING;
return ret;
return (ret > 0)? ret : 0;
}
/*