Page MenuHomeFreeBSD

D54129.id167715.diff
No OneTemporary

D54129.id167715.diff

diff --git a/sys/dev/sound/midi/midi.c b/sys/dev/sound/midi/midi.c
--- a/sys/dev/sound/midi/midi.c
+++ b/sys/dev/sound/midi/midi.c
@@ -61,7 +61,7 @@
#define MIDI_NAMELEN 16
struct snd_midi {
KOBJ_FIELDS;
- struct mtx lock; /* Protects all but queues */
+ struct mtx lock;
void *cookie;
int unit;
@@ -70,7 +70,6 @@
int busy;
int flags; /* File flags */
char name[MIDI_NAMELEN];
- struct mtx qlock; /* Protects inq, outq and flags */
MIDIQ_HEAD(, char) inq, outq;
int rchan, wchan;
struct selinfo rsel, wsel;
@@ -134,10 +133,8 @@
goto err1;
mtx_init(&m->lock, "raw midi", NULL, 0);
- mtx_init(&m->qlock, "q raw midi", NULL, 0);
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
if (inqsize)
buf = malloc(sizeof(uint8_t) * inqsize, M_MIDI, M_NOWAIT);
@@ -168,7 +165,6 @@
goto err2;
mtx_unlock(&m->lock);
- mtx_unlock(&m->qlock);
m->dev = make_dev(&midi_cdevsw, m->unit, UID_ROOT, GID_WHEEL, 0666,
"midi%d.%d", m->unit, m->channel);
@@ -177,7 +173,6 @@
return m;
err2:
- mtx_destroy(&m->qlock);
mtx_destroy(&m->lock);
if (MIDIQ_BUF(m->inq))
@@ -249,17 +244,18 @@
{
int used;
+ mtx_lock(&m->lock);
+
MIDI_DEBUG(5, printf("midi_in: m=%p size=%d\n", m, size));
-/*
- * XXX: locking flub
- */
- if (!(m->flags & M_RX))
- return size;
+ if (!(m->flags & M_RX)) {
+ /* We should return 0 but this may stop receiving/sending. */
+ mtx_unlock(&m->lock);
+ return (size);
+ }
used = 0;
- mtx_lock(&m->qlock);
MIDI_DEBUG(6, printf("midi_in: len %jd avail %jd\n",
(intmax_t)MIDIQ_LEN(m->inq),
(intmax_t)MIDIQ_AVAIL(m->inq)));
@@ -268,7 +264,7 @@
MIDIQ_ENQ(m->inq, buf, size);
} else {
MIDI_DEBUG(4, printf("midi_in: Discarding data qu\n"));
- mtx_unlock(&m->qlock);
+ mtx_unlock(&m->lock);
return 0;
}
if (m->rchan) {
@@ -276,7 +272,7 @@
m->rchan = 0;
}
selwakeup(&m->rsel);
- mtx_unlock(&m->qlock);
+ mtx_unlock(&m->lock);
return used;
}
@@ -288,14 +284,14 @@
{
int used;
-/*
- * XXX: locking flub
- */
- if (!(m->flags & M_TXEN))
- return 0;
+ mtx_lock(&m->lock);
MIDI_DEBUG(2, printf("midi_out: %p\n", m));
- mtx_lock(&m->qlock);
+ if (!(m->flags & M_TXEN)) {
+ mtx_unlock(&m->lock);
+ return (0);
+ }
+
used = MIN(size, MIDIQ_LEN(m->outq));
MIDI_DEBUG(3, printf("midi_out: used %d\n", used));
if (used)
@@ -311,7 +307,7 @@
}
selwakeup(&m->wsel);
}
- mtx_unlock(&m->qlock);
+ mtx_unlock(&m->lock);
return used;
}
@@ -327,7 +323,6 @@
return ENXIO;
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
retval = 0;
@@ -368,7 +363,7 @@
MIDI_DEBUG(2, printf("midi_open: opened.\n"));
-err: mtx_unlock(&m->qlock);
+err:
mtx_unlock(&m->lock);
return retval;
}
@@ -387,7 +382,6 @@
return ENXIO;
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
if ((flags & FREAD && !(m->flags & M_RX)) ||
(flags & FWRITE && !(m->flags & M_TX))) {
@@ -408,7 +402,6 @@
MIDI_DEBUG(1, printf("midi_close: closed, busy = %d.\n", m->busy));
- mtx_unlock(&m->qlock);
mtx_unlock(&m->lock);
retval = 0;
err: return retval;
@@ -436,7 +429,6 @@
goto err0;
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
if (!(m->flags & M_RX))
goto err1;
@@ -446,9 +438,8 @@
retval = EWOULDBLOCK;
if (ioflag & O_NONBLOCK)
goto err1;
- mtx_unlock(&m->lock);
m->rchan = 1;
- retval = msleep(&m->rchan, &m->qlock,
+ retval = msleep(&m->rchan, &m->lock,
PCATCH | PDROP, "midi RX", 0);
/*
* We slept, maybe things have changed since last
@@ -462,7 +453,6 @@
if (retval)
goto err0;
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
m->rchan = 0;
if (!m->busy)
goto err1;
@@ -486,7 +476,7 @@
* If we Made it here then transfer is good
*/
retval = 0;
-err1: mtx_unlock(&m->qlock);
+err1:
mtx_unlock(&m->lock);
err0: MIDI_DEBUG(4, printf("midi_read: ret %d\n", retval));
return retval;
@@ -511,7 +501,6 @@
goto err0;
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
if (!(m->flags & M_TX))
goto err1;
@@ -521,10 +510,9 @@
retval = EWOULDBLOCK;
if (ioflag & O_NONBLOCK)
goto err1;
- mtx_unlock(&m->lock);
m->wchan = 1;
MIDI_DEBUG(3, printf("midi_write msleep\n"));
- retval = msleep(&m->wchan, &m->qlock,
+ retval = msleep(&m->wchan, &m->lock,
PCATCH | PDROP, "midi TX", 0);
/*
* We slept, maybe things have changed since last
@@ -537,7 +525,6 @@
if (retval)
goto err0;
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
m->wchan = 0;
if (!m->busy)
goto err1;
@@ -570,7 +557,7 @@
* If we Made it here then transfer is good
*/
retval = 0;
-err1: mtx_unlock(&m->qlock);
+err1:
mtx_unlock(&m->lock);
err0: return retval;
}
@@ -594,7 +581,6 @@
revents = 0;
mtx_lock(&m->lock);
- mtx_lock(&m->qlock);
if (events & (POLLIN | POLLRDNORM)) {
if (!MIDIQ_EMPTY(m->inq))
@@ -610,7 +596,6 @@
}
mtx_unlock(&m->lock);
- mtx_unlock(&m->qlock);
return (revents);
}
@@ -633,7 +618,6 @@
free_unr(midi_unr, m->unit);
free(MIDIQ_BUF(m->inq), M_MIDI);
free(MIDIQ_BUF(m->outq), M_MIDI);
- mtx_destroy(&m->qlock);
mtx_destroy(&m->lock);
free(m, M_MIDI);
return 0;

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 10, 12:27 AM (19 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40514032
Default Alt Text
D54129.id167715.diff (5 KB)

Event Timeline