Skip to content

Commit 6b280ce

Browse files
committed
Explicitly destroy cond/mutex
1 parent 726c2a7 commit 6b280ce

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

virtio-snd.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ static void virtio_snd_read_pcm_prepare(const virtio_snd_pcm_hdr_t *query,
518518
* the length of frame). */
519519
/* CNFA only accept frame with signed 16-bit data in little-endian. */
520520
props->audio_host =
521-
CNFAInit(NULL, "semu-virtio-snd", virtio_snd_cb, rate, 0, channels, 0,
521+
CNFAInit("ALSA", "semu-virtio-snd", virtio_snd_cb, rate, 0, channels, 0,
522522
cnfa_period_frames, NULL, NULL, &props->v);
523523
pthread_mutex_init(&props->lock.lock, NULL);
524524
pthread_cond_init(&props->lock.readable, NULL);
@@ -535,6 +535,7 @@ static void virtio_snd_read_pcm_prepare(const virtio_snd_pcm_hdr_t *query,
535535
static void virtio_snd_read_pcm_start(const virtio_snd_pcm_hdr_t *query,
536536
uint32_t *plen)
537537
{
538+
fprintf(stderr, "pcm_start start\n");
538539
const virtio_snd_pcm_hdr_t *request = query;
539540
uint32_t stream_id = request->stream_id;
540541
uint32_t code = vsnd_props[stream_id].pp.hdr.hdr.code;
@@ -554,11 +555,13 @@ static void virtio_snd_read_pcm_start(const virtio_snd_pcm_hdr_t *query,
554555
pthread_cond_signal(&props->v.ctrl_cond);
555556

556557
*plen = 0;
558+
fprintf(stderr, "pcm_start stop\n");
557559
}
558560

559561
static void virtio_snd_read_pcm_stop(const virtio_snd_pcm_hdr_t *query,
560562
uint32_t *plen)
561563
{
564+
fprintf(stderr, "pcm_stop start\n");
562565
const virtio_snd_pcm_hdr_t *request = query;
563566
uint32_t stream_id = request->stream_id;
564567
uint32_t code = vsnd_props[stream_id].pp.hdr.hdr.code;
@@ -577,11 +580,13 @@ static void virtio_snd_read_pcm_stop(const virtio_snd_pcm_hdr_t *query,
577580
pthread_cond_signal(&props->v.ctrl_cond);
578581

579582
*plen = 0;
583+
fprintf(stderr, "pcm_stop stop\n");
580584
}
581585

582586
static void virtio_snd_read_pcm_release(const virtio_snd_pcm_hdr_t *query,
583587
uint32_t *plen)
584588
{
589+
fprintf(stderr, "pcm_release start\n");
585590
const virtio_snd_pcm_hdr_t *request = query;
586591
uint32_t stream_id = request->stream_id;
587592
virtio_snd_prop_t *props = &vsnd_props[stream_id];
@@ -597,12 +602,21 @@ static void virtio_snd_read_pcm_release(const virtio_snd_pcm_hdr_t *query,
597602
props->pp.hdr.hdr.code = VIRTIO_SND_R_PCM_RELEASE;
598603

599604
/* Tear down PCM buffer related locking attributes. */
605+
fprintf(stderr, "pcm_release tear down PCM buffer start\n");
600606
free(props->intermediate);
607+
608+
/* Explicitly unlock the CVs and mutex. */
609+
pthread_cond_broadcast(&props->lock.readable);
610+
pthread_cond_broadcast(&props->lock.writable);
611+
pthread_mutex_unlock(&props->lock.lock);
612+
601613
pthread_mutex_destroy(&props->lock.lock);
602614
pthread_cond_destroy(&props->lock.readable);
603615
pthread_cond_destroy(&props->lock.writable);
616+
fprintf(stderr, "pcm_release tear down PCM buffer stop\n");
604617

605618
/* Tear down PCM buffer queue. */
619+
fprintf(stderr, "pcm_release tear down PCM buffer queue\n");
606620
vsnd_buf_queue_node_t *tmp = NULL;
607621
vsnd_buf_queue_node_t *node;
608622
if (!list_empty(&props->buf_queue_head)) {
@@ -612,13 +626,17 @@ static void virtio_snd_read_pcm_release(const virtio_snd_pcm_hdr_t *query,
612626
}
613627
}
614628

615-
CNFAClose(props->audio_host);
616-
617629
/* Tear down stream related locking attributes. */
630+
pthread_cond_broadcast(&props->v.ctrl_cond);
631+
pthread_mutex_unlock(&props->v.ctrl_mutex);
618632
pthread_mutex_destroy(&props->v.ctrl_mutex);
619633
pthread_cond_destroy(&props->v.ctrl_cond);
620634

635+
fprintf(stderr, "pcm_release tear down CNFA\n");
636+
CNFAClose(props->audio_host);
637+
621638
*plen = 0;
639+
fprintf(stderr, "pcm_release stop\n");
622640
}
623641

624642
static void __virtio_snd_frame_dequeue(short *out,
@@ -668,6 +686,7 @@ static void virtio_snd_cb(struct CNFADriver *dev,
668686

669687
pthread_mutex_lock(&v_ptr->ctrl_mutex);
670688
while (v_ptr->guest_playing == 0) {
689+
fprintf(stderr, "wait ctrl_cond\n");
671690
memset(out, 0, sizeof(*out) * out_buf_sz);
672691
pthread_cond_wait(&v_ptr->ctrl_cond, &v_ptr->ctrl_mutex);
673692
}

0 commit comments

Comments
 (0)