Hi Denis, >> + /* Ask main loop to join */ >> + g_idle_add(thread_cleanup, userdata); > > This part makes no sense to me. We have two broad cases being covered: > 1. Cleaning up the threads on exit, in which case this g_idle_add is > pointless since there is no more main loop to run > 2. Cleaning up the thread when an exceptional condition occurs, e.g. > socket is closed. There would be a race condition if the thread had to remove itself from the threads list while, at same time, the main loop would parse the threads list. This is possible if exit and socket close occurs simultaneously. Thus the threads list is handled from main thread only. This way, hfp_thread structure is guaranted to be accessible during thread's life. > You might want to separate the logic for each appropriately. > > A more broad question is, why are you using threads in the first place? > Can't we interact with ALSA via regular FD polling? In theory, snd_pcm_poll_descriptors can be used for that. But this depends on ALSA driver implementation and I got some weird behavior. The sound was choppy using glib polling, so I used threads. Regards, Fred