Hi All
I'm still working through the wxWidgets bug, implementing multithreading. I 
already reported a possible snag with race conditions with users setting 
specific keyboard actions. However i've come accross a rather larger snag.
 
Calling plRemakePlot also generates a race condition, perhaps in some very 
complicated ways. From a quick look at the code there is some attempt to 
protect the buffer from being written to while it is being read. However a 
number of problems can occur. If the main thread calls plbuf_save while the GUI 
thread is running plRemakePlot then the plbuf_write and plbuf_read flags will 
be set in both functions causing them to be reset before one function has 
finished - i guess it's quite likely that a segfault can occur in such a 
situation.
 
Also if the main thread attempts to draw while the GUI thread is running 
plRemakePlot then it looks to me as though various functions in plcore.c will 
check plbuf_write, find it is false and not write their commands to the buffer. 
This will presumably cause odd rendering bugs.
 
There is even a comment in the plRemakePlot source saying
    // Change the status of the flags before checking for a buffer.
    // Actually, more thought is needed if we want to support multithreaded
    // code correctly, specifically the case where two threads are using
    // the same plot stream (e.g. one thread is drawing the plot and another
    // thread is processing window manager messages).
 
If we want to have multithreading work correctly then this is the time for more 
thought. Does anyone have any suggestions? There are a few ways I can imagine 
making things work - I don't know how well each wil function or which will be 
best but i thought I'd throw them out as ideas for comment.
1) Try to threadsafe the plstream and/or the plbuf_buffer. Probably a good 
solution, but a lot of work and difficult to do in a cross platform way.
2) Create a function that creates a snapshot of the plbuf_buffer in a 
threadsafe way. This is also not very easy as the buffer could get reallocated 
during the copy or commands without data could be included without some sort of 
mutex. Again cross platform multithreading becomes an issue.
3)The wxWidgets device maintains its own version of plbuf_buffer. Could this be 
done by having the wxWidgets device have a local PLStream that it can use to 
call the functions in plbuf? This would allow code reuse. There is increased 
memory use here but it could be that this is the least work.
 
Any other suggestions or comments?
 
Phil   
------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
Plplot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/plplot-devel

Reply via email to