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