[Spice-devel] Help with solving a thread safety issue

Jeremy White jwhite at codeweavers.com
Fri Aug 22 11:41:11 PDT 2014


I'm hoping to ask for some advice on the spice server.

Background:
I've hit a bug with Xspice.  The current implementation uses a separate 
thread to grab pcm data from a fifo.  That same thread creates and 
drives the playback channel, and then pushes that data out using 
spice_server_playback_put_samples.

(That may have been a poor choice; I no longer recall if there was a 
careful understanding of the inter thread issues at that time.  But 
please bear with me).

If you have adaptive streaming turned on, you will eventually get a 
update_client_playback_latency message on the display channel (which in 
the Xspice case is being driven by the main, Xorg, thread).  Run the 
stream long enough, and the lack of thread safety will eventually bite 
you.  (It tends to expose some lovely behaviors in the snd_worker.c 
code; snd_send_data will spin loop nicely if some basic assumptions 
don't line up).

It is interesting (to me, at any rate), that main_dispatcher.c is 
provided as a mechanism to ensure that a message is sent by the right 
thread.  Of course, in this case, it is used to make sure the main 
thread is called, which doesn't help.

Questions:

What's the best way to fix this?  The alternates I'm considering are:
   1.  Rewrite the spiceqxl_audio code to run out of the main loop.
       That's a fair bit of work, and risks discarding some potentially 
hard earned wisdom from the past.  (afair, that was the first 
implementation attempt, and it had issues).

   2.  Surgically modify the snd_worker.c calls that handle the Playback 
channel to introduce a mutex; lock and release that mutex around 
operations.  This is the direction I'm leaning, but I don't see a lot of 
evidence that this is commonly done.

   3.  Somehow modify or parallel main_dispatcher.c so that the latency 
update call is invoked in the context of the correct thread.

Suggestions or clue bats greatly appreciated.

Cheers,

Jeremy


More information about the Spice-devel mailing list