[Bf-committers] Pretty clueless Linux threads crashing...

Ton Roosendaal ton at blender.org
Thu Feb 23 13:37:56 CET 2006

Hi all,

I need help locating what goes wrong in using thread render on Linux.  
I'm using SDL for threads, and it appears that in Linux threads refuse  
to close (well, gdb reports lotsof zombies to end), and after a while  
(unpredictable, but on some scenes every render) it ends with this:

#0  0xb781bcda in sem_post at GLIBC_2.0 () from  
(gdb) bt
#0  0xb781bcda in sem_post at GLIBC_2.0 () from  
#1  0xb7ba2748 in SDL_SemPost () from /usr/lib/libSDL-1.2.so.0
#2  0xb7ba1efb in SDL_RunThread () from /usr/lib/libSDL-1.2.so.0
#3  0xb7ba21d1 in SDL_KillThread () from /usr/lib/libSDL-1.2.so.0
#4  0xb7817361 in start_thread () from  
#5  0xb7912bde in clone () from /lib/tls/i686/cmov/libc.so.6

Note; I am using SDL_KillThread() now instead of the official  
SDL_WaitThread(), because that seems to be more *stable*... using  
SDL_WaitThread() gives same crashes.
I also have no idea what this bt means... why would the KillThread call  
a RunThread and then hang in sem_post()???

Some clues;
- it seems to happen more often when OpenGL is busy too. Like with huge  
windows it crashes more often. I do know that within a thread you  
should not use X11 or opengl, using windows/events/opengl calls in  
threads won't work on OSX either. Nevertheless, we did try Brecht's  
hint, to add XInitThreads() in GHOST_SystemX11.cpp, before line 107.  
Didn't really give improvements.
- when rendering without threads button pressed, rendering goes OK. The  
render code then still uses a single SDL thread for the tile render  
- On different Linux installs we get different reports. Some report  
crashes all the time, some claim its running fine.
- In OSX threads never crash this way, nor do we get zombie threads.  
OSX does have a quite rare opengl crash though, which also only seems  
to happen while using huge windows.
- I've very carefully checked all code to see if there's any  
opengl/event call during a thread, but couldn't find one. Still might  
be there though... maybe I'm just missing some.
- I'm not using semaphores code, but do have Mutex to protect the  
MEM_malloc calls.

The way I am using SDL threads for rendering:

- the main loop (not a thread) is in render module, pipeline.c,  
- this loop goes to sleep when all 'thread slots' are filled.
- 20 times per second it wakes up, and either draws a scanline part  
update, or the entire tile
- if a thread is finished, it sets a flag in the RenderPart struct to  
indicate that, then the mainloop makes sure a SDL_WaitThread is called  
(SDL_KillThread now)

I moved all threading code to blenlib/intern/threads.c. In the c file  
you can see docs for usage of the functions. Here also the mutexes are  
set and used for mallocs.

Hopefully someone reads this with SDL coding experience! :)


Ton Roosendaal  Blender Foundation ton at blender.org  

More information about the Bf-committers mailing list