Revision: 22956
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22956
Author:   theeth
Date:     2009-09-02 22:57:18 +0200 (Wed, 02 Sep 2009)

Log Message:
-----------
Fix thread hanging problem (mostly seen with material preview, but that sneaky 
f*er could strike any time).

Story time: Once upon a time, in the green valley of fileselect, 
BLI_end_threads would get called on an empty threadbase, depending on the 
result of a previous call to readdir(). The function would then gladly 
decrement thread_level to -1 which would cause all kinds of fun havoc. THE END.

Made sure thread_level is only incremented and decremented when needed. The 
caller should never have to make sure of that, especially since it already lets 
you call with a null threadbase.

Please report any further hang (and how to reproduce, if possible).

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/intern/threads.c

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/threads.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/threads.c 
2009-09-02 20:54:33 UTC (rev 22955)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/threads.c 
2009-09-02 20:57:18 UTC (rev 22956)
@@ -142,10 +142,10 @@
                        tslot->do_thread= do_thread;
                        tslot->avail= 1;
                }
+               
+               MEM_set_lock_callback(BLI_lock_malloc_thread, 
BLI_unlock_malloc_thread);
+               thread_levels++;
        }
-
-       MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread);
-       thread_levels++;
 }
 
 /* amount of available threads */
@@ -235,18 +235,21 @@
 {
        ThreadSlot *tslot;
        
-       if (threadbase) {
+       /* only needed if there's actually some stuff to end
+        * this way we don't end up decrementing thread_levels on an empty 
threadbase 
+        * */
+       if (threadbase && threadbase->first != NULL) {
                for(tslot= threadbase->first; tslot; tslot= tslot->next) {
                        if(tslot->avail==0) {
                                pthread_join(tslot->pthread, NULL);
                        }
                }
                BLI_freelistN(threadbase);
+
+               thread_levels--;
+               if(thread_levels==0)
+                       MEM_set_lock_callback(NULL, NULL);
        }
-       
-       thread_levels--;
-       if(thread_levels==0)
-               MEM_set_lock_callback(NULL, NULL);
 }
 
 void BLI_lock_thread(int type)


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to