--- blender-2.42a/source/creator/creator.c.morethreads 2006-07-12 22:01:48.000000000 +0200 +++ blender-2.42a/source/creator/creator.c 2006-08-09 15:30:42.000000000 +0200 @@ -96,6 +96,9 @@ # include <sys/rtprio.h> #endif +#include <unistd.h> +#include <stdlib.h> + // from buildinfo.c #ifdef BUILD_DATE extern char * build_date; @@ -222,17 +225,36 @@ double PIL_check_seconds_timer(void); extern void winlay_get_screensize(int *width_r, int *height_r); +extern int ncpus_system; +extern int blender_nthreads; + int main(int argc, char **argv) { int a, i, stax, stay, sizx, sizy; SYS_SystemHandle syshandle; Scene *sce; + char *blender_nthreads_env; #if defined(WIN32) || defined (__linux__) int audio = 1; #else int audio = 0; #endif + + ncpus_system = (int) sysconf(_SC_NPROCESSORS_ONLN); + + if (ncpus_system < 1) + ncpus_system = 1; + + if ((blender_nthreads_env = getenv("BLENDER_NTHREADS")) != NULL) + blender_nthreads = atol(blender_nthreads_env); + + if (blender_nthreads > ncpus_system) + blender_nthreads = ncpus_system; + + if (blender_nthreads < 1) + blender_nthreads = 1; + setCallbacks(); #ifdef __APPLE__ /* patch to ignore argument finder gives us (pid?) */ --- blender-2.42a/source/creator/buildinfo.c.morethreads 2006-08-09 15:19:29.000000000 +0200 +++ blender-2.42a/source/creator/buildinfo.c 2006-08-09 15:27:43.000000000 +0200 @@ -44,3 +44,6 @@ #include "winbuildinfo.h" #endif #endif + +int ncpus_system = 1; +int blender_nthreads = 2; --- blender-2.42a/source/blender/blenkernel/intern/node.c.morethreads 2006-07-09 13:54:41.000000000 +0200 +++ blender-2.42a/source/blender/blenkernel/intern/node.c 2006-08-09 15:25:07.000000000 +0200 @@ -2016,6 +2016,7 @@ return NULL; } +extern int blender_nthreads; /* optimized tree execute test for compositing */ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) @@ -2028,7 +2029,7 @@ if(ntree==NULL) return; if(rd->mode & R_THREADS) - maxthreads= 2; + maxthreads= blender_nthreads; else maxthreads= 1; --- blender-2.42a/source/blender/render/intern/source/pipeline.c.morethreads 2006-08-09 14:15:32.000000000 +0200 +++ blender-2.42a/source/blender/render/intern/source/pipeline.c 2006-08-09 15:25:31.000000000 +0200 @@ -1091,6 +1091,8 @@ re->i.infostr= NULL; } +extern int blender_nthreads; + static void threaded_tile_processor(Render *re) { ListBase threads; @@ -1120,7 +1122,7 @@ IMB_exrtile_begin_write(rr->exrhandle, str, rr->rectx, rr->recty, rr->rectx/re->xparts, rr->recty/re->yparts); } - if(re->r.mode & R_THREADS) maxthreads= 2; + if(re->r.mode & R_THREADS) maxthreads= blender_nthreads; else maxthreads= 1; BLI_init_threads(&threads, do_part_thread, maxthreads); --- blender-2.42a/source/blender/blenlib/intern/threads.c.morethreads 2006-03-13 12:01:17.000000000 +0100 +++ blender-2.42a/source/blender/blenlib/intern/threads.c 2006-08-09 15:25:51.000000000 +0200 @@ -38,6 +38,7 @@ #include "BLI_blenlib.h" #include "BLI_threads.h" +extern int blender_nthreads; /* ********** basic thread control API ************ @@ -50,7 +51,7 @@ A sample loop can look like this (pseudo c); ListBase lb; - int maxthreads= 2; + int maxthreads= blender_nthreads; int cont= 1; BLI_init_threads(&lb, do_something_func, maxthreads);