== Sequencer ==
authorPeter Schlaile <peter@schlaile.de>
Sun, 25 Nov 2007 16:35:33 +0000 (16:35 +0000)
committerPeter Schlaile <peter@schlaile.de>
Sun, 25 Nov 2007 16:35:33 +0000 (16:35 +0000)
Added malloc mutex handling. (Sorry, had to patch threads.c a bit,
since otherwise scene tracks will completely screw things up...)

source/blender/blenlib/intern/threads.c
source/blender/src/sequence.c

index cb10185386adc36c7c1ea624bf49a86640fd9c07..1f05070b03424d8b8ed1bd5da700df7bcba2b23e 100644 (file)
@@ -109,22 +109,26 @@ static void BLI_unlock_malloc_thread(void)
        pthread_mutex_unlock(&_malloc_lock);
 }
 
+/* tot = 0 only initializes malloc mutex in a safe way (see sequence.c)
+   problem otherwise: scene render will kill of the mutex!
+*/
+
 void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot)
 {
        int a;
        
-       if(threadbase==NULL)
-               return;
-       threadbase->first= threadbase->last= NULL;
+       if(threadbase != NULL && tot > 0) {
+               threadbase->first= threadbase->last= NULL;
        
-       if(tot>RE_MAX_THREAD) tot= RE_MAX_THREAD;
-       else if(tot<1) tot= 1;
+               if(tot>RE_MAX_THREAD) tot= RE_MAX_THREAD;
+               else if(tot<1) tot= 1;
        
-       for(a=0; a<tot; a++) {
-               ThreadSlot *tslot= MEM_callocN(sizeof(ThreadSlot), "threadslot");
-               BLI_addtail(threadbase, tslot);
-               tslot->do_thread= do_thread;
-               tslot->avail= 1;
+               for(a=0; a<tot; a++) {
+                       ThreadSlot *tslot= MEM_callocN(sizeof(ThreadSlot), "threadslot");
+                       BLI_addtail(threadbase, tslot);
+                       tslot->do_thread= do_thread;
+                       tslot->avail= 1;
+               }
        }
 
        MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread);
@@ -190,12 +194,14 @@ void BLI_end_threads(ListBase *threadbase)
 {
        ThreadSlot *tslot;
        
-       for(tslot= threadbase->first; tslot; tslot= tslot->next) {
-               if(tslot->avail==0) {
-                       pthread_join(tslot->pthread, NULL);
+       if (threadbase) {
+               for(tslot= threadbase->first; tslot; tslot= tslot->next) {
+                       if(tslot->avail==0) {
+                               pthread_join(tslot->pthread, NULL);
+                       }
                }
+               BLI_freelistN(threadbase);
        }
-       BLI_freelistN(threadbase);
        
        thread_levels--;
        if(thread_levels==0)
index 1e0026cde935c2503ab99af8841c8c4d229252fc..73eb0a967642a0efa7c36c8d0634d8359cc80146 100644 (file)
@@ -71,6 +71,7 @@
 
 #include "blendef.h"
 
+#include "BLI_threads.h"
 #include <pthread.h>
 
 int seqrectx, seqrecty;
@@ -1269,7 +1270,6 @@ typedef struct PrefetchQueueElem {
        struct ImBuf * ibuf;
 } PrefetchQueueElem;
 
-
 static void * seq_prefetch_thread(void * This_)
 {
        PrefetchThread * This = This_;
@@ -1370,6 +1370,9 @@ void seq_start_threads()
 
                pthread_create(&t->pthread, NULL, seq_prefetch_thread, t);
        }
+
+       /* init malloc mutex */
+       BLI_init_threads(0, 0, 0);
 }
 
 void seq_stop_threads()
@@ -1410,6 +1413,9 @@ void seq_stop_threads()
        }
 
        BLI_freelistN(&running_threads);
+
+       /* deinit malloc mutex */
+       BLI_end_threads(0);
 }
 
 void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown)