[ pyopengl-Bugs-3127034 ] VBO deletion happening in another thread than Main thread

"SourceForge.net" <[email protected]> Wed, 18 May 2011 10:37:36 +0000
Newsgroups gmane.comp.python.opengl.devel
Message-ID <[email protected]>
Bugs item #3127034, was opened at 2010-12-04 00:00
Message generated for change (Comment added) made by nobody
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105988&aid=3127034&group_id=5988

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: GL
Group: v3.0.0
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: Nobody/Anonymous (nobody)
Assigned to: Mike C. Fletcher (mcfletch)
Summary: VBO deletion happening in another thread than Main thread 

Initial Comment:
Hi pyopengl dudes,

I got a bug with VBO. It seem that the deletion of VBO (the one that involve glDeleteBuffers) is happening sometimes inside another thread than Main thread, and lead to a segfault.

I've added a call to threading.currentThread() + traceback.print_stack() just before the call of glDeleteBuffers() in arrays/vbo.py.
And normal case, i got: glDeleteBuffers() <_MainThread(MainThread, started 140737353901824)> + a traceback with last line very weird (like gc call...)
And the segfault case: glDeleteBuffers() <Thread(Thread-6, started daemon 140736902752016)>

Here is both traceback that look different : http://paste.pocoo.org/show/300045/ and http://paste.pocoo.org/show/300047/

It look like the callback of weakref.ref() is called when the object is deleted and finalized... but not in main thread.

Do you confirm this case ? Do you have any tips about how to do ?
I was thinking to use a Queue, and if the deletion happen outside the main thread, queuing the deletion for the next call. (tricky, but since pyopengl don't have clokc of callback from main thread...)

----------------------------------------------------------------------

Comment By: Nobody/Anonymous (nobody)
Date: 2011-05-18 10:37

Message:
Tracker.. Bang-up :)

----------------------------------------------------------------------

Comment By: Mike C. Fletcher (mcfletch)
Date: 2010-12-06 14:21

Message:
?? boggle ??  Okay, *that* is surprising.  AFAIK the weakref code is just
hooked into the DECREF counting so that iff count goes to < 1 then the
weakrefs are called, then the __del__ method.  I suppose somehow one of the
callbacks might allow a thread context switch... but that still seems
pretty exotic.  Don't suppose you have a small test-case that shows this?

----------------------------------------------------------------------

Comment By: https://www.google.com/accounts ()
Date: 2010-12-05 17:11

Message:
Just to ensure you've understand me, i don't do any deletion of VBO in
another thread than main thread. I've a reference to the VBO in a class,
and when the class is gone, the vbo is gone too. All theses operations are
always executed in a main thread.

That's why i think this bug can happen as soon as you use thread in python
no ? And that's problematic :/

----------------------------------------------------------------------

Comment By: Mike C. Fletcher (mcfletch)
Date: 2010-12-05 13:49

Message:
The appropriate way to delete a VBO in a multi-threaded situation is to
call .delete() on it in the rendering thread *before* you delete the VBO in
another thread.  The VBO's cleanup will then *not* delete the VBO. 
Anything I do to try to work around this will constrain the design of all
pyopengl applications.

That said, your approach would work fine (moving the deletions to the main
thread) for your application:

# non-render thread
for obj in objs_to_delete:
    remove_from_tree(obj)
    to_delete_queue.push( obj ) # no garbage collection here because of
this reference

# render thread
while: to_delete_queue:
    to_delete_queue.pop() # garbage collected and deleted here...

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105988&aid=3127034&group_id=5988

------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its 
next-generation tools to help Windows* and Linux* C/C++ and Fortran 
developers boost performance applications - including clusters. 
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
PyOpenGL Homepage
http://pyopengl.sourceforge.net