NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
re: kern/46121: audiomp: locking protocol error
The following reply was made to PR kern/46121; it has been noted by GNATS.
From: matthew green <mrg%eterna.com.au@localhost>
To: ad%netbsd.org@localhost, gnats-bugs%NetBSD.org@localhost
Cc: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
netbsd-bugs%netbsd.org@localhost
Subject: re: kern/46121: audiomp: locking protocol error
Date: Mon, 26 Mar 2012 18:07:02 +1100
this looks like it should do the trick.
oh, i'll fix the comment as well.
.mrg.
Index: audio.c
===================================================================
RCS file: /cvsroot/src/sys/dev/audio.c,v
retrieving revision 1.258
diff -p -r1.258 audio.c
*** audio.c 21 Feb 2012 20:53:34 -0000 1.258
--- audio.c 26 Mar 2012 07:01:37 -0000
*************** audioattach(device_t parent, device_t se
*** 389,394 ****
--- 390,396 ----
mixer_devinfo_t mi;
int iclass, mclass, oclass, rclass, props;
int record_master_found, record_source_found;
+ bool can_capture, can_playback;
sc = device_private(self);
sc->dev = self;
*************** audioattach(device_t parent, device_t se
*** 459,482 ****
* Revisit.
*/
mutex_enter(sc->sc_lock);
! if (audio_can_playback(sc)) {
error = audio_alloc_ring(sc, &sc->sc_pr,
AUMODE_PLAY, AU_RING_SIZE);
if (error) {
sc->hw_if = NULL;
- mutex_exit(sc->sc_lock);
aprint_error("audio: could not allocate play buffer\n");
return;
}
}
! if (audio_can_capture(sc)) {
error = audio_alloc_ring(sc, &sc->sc_rr,
AUMODE_RECORD, AU_RING_SIZE);
if (error) {
if (sc->sc_pr.s.start != 0)
audio_free_ring(sc, &sc->sc_pr);
sc->hw_if = NULL;
- mutex_exit(sc->sc_lock);
aprint_error("audio: could not allocate record
buffer\n");
return;
}
--- 461,486 ----
* Revisit.
*/
mutex_enter(sc->sc_lock);
! can_playback = audio_can_playback(sc);
! can_capture = audio_can_capture(sc);
! mutex_exit(sc->sc_lock);
!
! if (can_playback) {
error = audio_alloc_ring(sc, &sc->sc_pr,
AUMODE_PLAY, AU_RING_SIZE);
if (error) {
sc->hw_if = NULL;
aprint_error("audio: could not allocate play buffer\n");
return;
}
}
! if (can_capture) {
error = audio_alloc_ring(sc, &sc->sc_rr,
AUMODE_RECORD, AU_RING_SIZE);
if (error) {
if (sc->sc_pr.s.start != 0)
audio_free_ring(sc, &sc->sc_pr);
sc->hw_if = NULL;
aprint_error("audio: could not allocate record
buffer\n");
return;
}
*************** audioattach(device_t parent, device_t se
*** 484,489 ****
--- 488,494 ----
sc->sc_lastgain = 128;
+ mutex_enter(sc->sc_lock);
error = audio_set_defaults(sc, 0);
mutex_exit(sc->sc_lock);
if (error != 0) {
*************** audio_alloc_ring(struct audio_softc *sc,
*** 884,891 ****
if (bufsize < AUMINBUF)
bufsize = AUMINBUF;
ROUNDSIZE(bufsize);
! if (hw->round_buffersize)
bufsize = hw->round_buffersize(hdl, direction, bufsize);
if (hw->allocm)
r->s.start = hw->allocm(hdl, direction, bufsize);
else
--- 889,899 ----
if (bufsize < AUMINBUF)
bufsize = AUMINBUF;
ROUNDSIZE(bufsize);
! if (hw->round_buffersize) {
! mutex_enter(sc->sc_lock);
bufsize = hw->round_buffersize(hdl, direction, bufsize);
+ mutex_exit(sc->sc_lock);
+ }
if (hw->allocm)
r->s.start = hw->allocm(hdl, direction, bufsize);
else
Home |
Main Index |
Thread Index |
Old Index