changeset 10016:f517d06e1c5e

6853360 crash during mplayer/sun audio
author Garrett D'Amore <gdamore@opensolaris.org>
date Wed, 01 Jul 2009 17:10:10 -0700
parents 0bf0ddae6058
children d778b606e96c
files usr/src/uts/common/io/audio/impl/audio_sun.c
diffstat 1 files changed, 10 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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);
 	}