Index: virtual_main.c =================================================================== --- virtual_main.c +++ virtual_main.c @@ -58,8 +58,10 @@ static void atomic_init(void) { - pthread_mutex_init(&atomic_mtx, NULL); - pthread_cond_init(&atomic_cv, NULL); + if (pthread_mutex_init(&atomic_mtx, NULL) != 0) + err(1, "pthread_mutex_init"); + if (pthread_cond_init(&atomic_cv, NULL) != 0) + err(1, "pthread_cond_init"); } void @@ -1648,6 +1650,8 @@ struct voss_backend *voss_tx_backend; static int voss_dups; +static int voss_ntds; +static pthread_t *voss_tds; static void voss_rx_backend_refresh(void) @@ -2488,17 +2492,31 @@ int idx; /* Give each DSP device 4 threads */ - - for (idx = 0; idx != (voss_dups * 4); idx++) { - pthread_t td; - - pthread_create(&td, NULL, &virtual_cuse_process, NULL); + voss_ntds = voss_dups * 4; + voss_tds = malloc(voss_ntds * sizeof(pthread_t)); + if (voss_tds == NULL) + err(1, "malloc"); + + for (idx = 0; idx < voss_ntds; idx++) { + if (pthread_create(&voss_tds[idx], NULL, &virtual_cuse_process, + NULL) != 0) + err(1, "pthread_create"); } /* Reset until next time called */ voss_dups = 0; } +static void +destroy_threads(void) +{ + int idx; + + for (idx = 0; idx < voss_ntds; idx++) + pthread_cancel(voss_tds[idx]); + free(voss_tds); +} + void voss_add_options(char *str) { @@ -2652,6 +2670,8 @@ virtual_oss_process(NULL); + destroy_threads(); + if (voss_ctl_device[0] != 0) { cuse_dev_destroy(pdev); cuse_uninit();