Revision: 16673
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16673
Author:   genscher
Date:     2008-09-22 14:31:27 +0200 (Mon, 22 Sep 2008)

Log Message:
-----------
Fluid: Remove SDL threads, also fixed the 'finished too early' problem reported 
once in tracker

Modified Paths:
--------------
    trunk/blender/source/blender/src/fluidsim.c

Modified: trunk/blender/source/blender/src/fluidsim.c
===================================================================
--- trunk/blender/source/blender/src/fluidsim.c 2008-09-22 12:18:07 UTC (rev 
16672)
+++ trunk/blender/source/blender/src/fluidsim.c 2008-09-22 12:31:27 UTC (rev 
16673)
@@ -55,6 +55,7 @@
 #include "DNA_key_types.h" 
 
 #include "BLI_blenlib.h"
+#include "BLI_threads.h"
 #include "BLI_arithb.h"
 #include "MTC_matrixops.h"
 
@@ -86,9 +87,6 @@
 
 #include "mydevice.h"
 #include "blendef.h"
-#include "SDL.h"
-#include "SDL_thread.h"
-#include "SDL_mutex.h"
 #include <sys/stat.h>
 
 #ifdef WIN32   /* Windos */
@@ -97,13 +95,7 @@
 #define snprintf _snprintf
 #endif
 #endif
-// SDL redefines main for SDL_main, not needed here...
-#undef main
 
-#ifdef __APPLE__       /* MacOS X */
-#undef main
-#endif
-
 /* from header info.c */
 extern int start_progress_bar(void);
 extern void end_progress_bar(void);
@@ -287,9 +279,9 @@
 /* ********************** simulation thread             
************************* */
 /* 
********************************************************************************
 */
 
-SDL_mutex      *globalBakeLock=NULL;
-int                    globalBakeState = 0; // 0 everything ok, -1 abort 
simulation, -2 sim error, 1 sim done
-int                    globalBakeFrame = 0;
+static volatile int    globalBakeState = 0; // 0 everything ok, -1 abort 
simulation, -2 sim error, 1 sim done
+static volatile int    globalBakeFrame = 0;
+static volatile int g_break= 0;
 
 // run simulation in seperate thread
 static int fluidsimSimulateThread(void *unused) { // *ptr) {
@@ -297,7 +289,7 @@
        int ret=0;
        
        ret = elbeemSimulate();
-       SDL_mutexP(globalBakeLock);
+       BLI_lock_thread(LOCK_CUSTOM1);
        if(globalBakeState==0) {
                if(ret==0) {
                        // if no error, set to normal exit
@@ -307,29 +299,31 @@
                        globalBakeState = -2;
                }
        }
-       SDL_mutexV(globalBakeLock);
-       return ret;
+       BLI_unlock_thread(LOCK_CUSTOM1);
+       return NULL;
 }
 
 
 int runSimulationCallback(void *data, int status, int frame) {
        //elbeemSimulationSettings *settings = (elbeemSimulationSettings*)data;
        //printf("elbeem blender cb s%d, f%d, domainid:%d \n", status,frame, 
settings->domainId ); // DEBUG
-       
-       if(!globalBakeLock) return FLUIDSIM_CBRET_ABORT;
+       int state = 0;
        if(status==FLUIDSIM_CBSTATUS_NEWFRAME) {
-               SDL_mutexP(globalBakeLock);
+               BLI_lock_thread(LOCK_CUSTOM1);
                globalBakeFrame = frame-1;
-               SDL_mutexV(globalBakeLock);
+               BLI_unlock_thread(LOCK_CUSTOM1);
        }
        
        //if((frameCounter==3) && (!frameStop)) { frameStop=1; return 1; }
                
-       SDL_mutexP(globalBakeLock);
-       if(globalBakeState!=0) {
+       BLI_lock_thread(LOCK_CUSTOM1);
+       state = globalBakeState;
+       BLI_unlock_thread(LOCK_CUSTOM1);
+       
+       if(state!=0) {
                return FLUIDSIM_CBRET_ABORT;
        }
-       SDL_mutexV(globalBakeLock);
+       
        return FLUIDSIM_CBRET_CONTINUE;
 }
 
@@ -826,9 +820,9 @@
        }
 
        if(!doExportOnly) {
-               SDL_Thread *simthr = NULL;
+               ListBase threads;
 
-               // perform simulation with El'Beem api and SDL threads
+               // perform simulation with El'Beem api and threads
                elbeemSimulationSettings fsset;
                elbeemResetSettings(&fsset);
                fsset.version = 1;
@@ -850,7 +844,7 @@
                // simulate 5 frames, each 0.03 seconds, output to 
./apitest_XXX.bobj.gz
                fsset.animStart = domainSettings->animStart;
                fsset.aniFrameTime = aniFrameTime;
-               fsset.noOfFrames = noFrames - 1; // is otherwise subtracted in 
parser
+               fsset.noOfFrames = noFrames; // is otherwise subtracted in 
parser
                strcpy(targetFile, targetDir);
                strcat(targetFile, suffixSurface);
                // defaults for compressibility and adaptive grids
@@ -1000,18 +994,13 @@
                //domainSettings->type = OB_FLUIDSIM_DOMAIN; // enable for bake 
display again
                //fsDomain->fluidsimFlag = OB_FLUIDSIM_ENABLE; // disable 
during bake
                
-               globalBakeLock = SDL_CreateMutex();
                // set to neutral, -1 means user abort, -2 means init error
                globalBakeState = 0;
                globalBakeFrame = 0;
-               simthr = SDL_CreateThread(fluidsimSimulateThread, targetFile);
-
-               if(!simthr) {
-                       snprintf(debugStrBuffer,256,"fluidsimBake::error: 
Unable to create thread... running without one.\n"); 
-                       elbeemDebugOut(debugStrBuffer);
-                       set_timecursor(0);
-                       elbeemSimulate();
-               } else {
+               BLI_init_threads(&threads, fluidsimSimulateThread, 1);
+               BLI_insert_thread(&threads, targetFile);
+               
+               {
                        int done = 0;
                        unsigned short event=0;
                        short val;
@@ -1019,9 +1008,12 @@
                        float percentdone = 0.0;
                        int lastRedraw = -1;
                        
+                       g_break= 0;
+                       G.afbreek= 0;   /* blender_test_break uses this global 
*/
+                       
                        start_progress_bar();
 
-                       while(done==0) {            
+                       while(done==0) {
                                char busy_mess[80];
                                
                                waitcursor(1);
@@ -1031,16 +1023,20 @@
                                sprintf(busy_mess, "baking fluids %d / %d       
|||", globalBakeFrame, (int) noFramesf);
                                progress_bar(percentdone, busy_mess );
                                
-                               SDL_Delay(2000); // longer delay to prevent 
frequent redrawing
-                               SDL_mutexP(globalBakeLock);
+                               // longer delay to prevent frequent redrawing
+                               PIL_sleep_ms(2000);
+                               
+                               BLI_lock_thread(LOCK_CUSTOM1);
                                if(globalBakeState != 0) done = 1; // 1=ok, 
<0=error/abort
-                               SDL_mutexV(globalBakeLock);
+                               BLI_unlock_thread(LOCK_CUSTOM1);
 
-                               while(qtest()) {
-                                       event = extern_qread(&val);
-                                       if(event == ESCKEY) {
+                               if (!G.background) {
+                                       g_break= blender_test_break();
+                                       
+                                       if(g_break)
+                                       {
                                                // abort...
-                                               SDL_mutexP(globalBakeLock);
+                                               BLI_lock_thread(LOCK_CUSTOM1);
                                                
                                                if(domainSettings)
                                                        
domainSettings->lastgoodframe = startFrame+globalBakeFrame;
@@ -1049,7 +1045,7 @@
                                                globalBakeFrame = 0;
                                                globalBakeState = -1;
                                                simAborted = 1;
-                                               SDL_mutexV(globalBakeLock);
+                                               BLI_unlock_thread(LOCK_CUSTOM1);
                                                break;
                                        }
                                } 
@@ -1068,11 +1064,9 @@
                                        screen_swapbuffers();
                                } // redraw
                        }
-                       SDL_WaitThread(simthr,NULL);
                        end_progress_bar();
                }
-               SDL_DestroyMutex(globalBakeLock);
-               globalBakeLock = NULL;
+               BLI_end_threads(&threads);
        } // El'Beem API init, thread creation 
        // 
--------------------------------------------------------------------------------------------
        else


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

Reply via email to