# HG changeset patch # User Garrett D'Amore # Date 1246493410 25200 # Node ID f517d06e1c5ea2620b27da22c41e8683f592035b # Parent 0bf0ddae605801504ee3064499ab47964fea2299 6853360 crash during mplayer/sun audio diff -r 0bf0ddae6058 -r f517d06e1c5e usr/src/uts/common/io/audio/impl/audio_sun.c --- a/usr/src/uts/common/io/audio/impl/audio_sun.c Wed Jul 01 16:23:05 2009 -0700 +++ b/usr/src/uts/common/io/audio/impl/audio_sun.c Wed Jul 01 17:10:10 2009 -0700 @@ -163,7 +163,7 @@ sclient_t *p_reader; }; -int sproc_hold(audio_client_t *, int); +int sproc_hold(audio_client_t *, ldi_handle_t, queue_t *, int); void sproc_release(sclient_t *); static void sproc_update(sproc_t *); @@ -474,7 +474,7 @@ } int -sproc_hold(audio_client_t *c, int oflag) +sproc_hold(audio_client_t *c, ldi_handle_t lh, queue_t *rq, int oflag) { pid_t pid; sproc_t *proc; @@ -522,8 +522,6 @@ list_insert_tail(l, proc); } - sc->s_proc = proc; - while (proc->p_oflag & oflag) { if (oflag & (FNDELAY|FNONBLOCK)) { @@ -592,6 +590,13 @@ proc->p_oflag |= FREAD; } + sc->s_lh = lh; + sc->s_rq = rq; + sc->s_wq = WR(rq); + WR(rq)->q_ptr = rq->q_ptr = sc; + /* we update the s_proc last to avoid a race */ + sc->s_proc = proc; + sproc_update(proc); mutex_exit(&sdev->d_mx); @@ -1409,7 +1414,6 @@ ldi_ident_t lid; ldi_handle_t lh = NULL; audio_client_t *c = NULL; - sclient_t *sc = NULL; audio_dev_t *adev; unsigned fmt; int oflag; @@ -1487,16 +1491,10 @@ } isopen = B_TRUE; - if ((rv = sproc_hold(c, oflag)) != 0) { + if ((rv = sproc_hold(c, lh, rq, oflag)) != 0) { goto fail; } - sc = auclnt_get_private(c); - WR(rq)->q_ptr = rq->q_ptr = sc; - sc->s_lh = lh; - sc->s_rq = rq; - sc->s_wq = WR(rq); - /* start up the input */ if (oflag & FREAD) { auclnt_start(auclnt_input_stream(c)); @@ -1510,9 +1508,6 @@ return (0); fail: - if (sc != NULL) { - sproc_release(sc); - } if (isopen) { auclnt_close(c); }