X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=tools%2Fquake3%2Fcommon%2Fthreads.c;h=b50f6d6071790e95e67a2e06a62b76c5b2d2153b;hb=f218b59000eb3dfffa0768ac0dec0a73266eaf41;hp=ed218d6ee960d8992cf41f736fed3537f7cc4080;hpb=0d2933a8b4d0cb87cb8ccc26d5ee979ce9a9703b;p=xonotic%2Fnetradiant.git diff --git a/tools/quake3/common/threads.c b/tools/quake3/common/threads.c index ed218d6e..b50f6d60 100644 --- a/tools/quake3/common/threads.c +++ b/tools/quake3/common/threads.c @@ -60,12 +60,17 @@ int GetThreadWork (void) } f = 40*dispatch / workcount; - if (f != oldf) + if(f < oldf) { + Sys_Printf("warning: progress went backwards (should never happen)\n"); oldf = f; + } + while(f > oldf) + { + ++oldf; if (pacifier) { - if(f % 4 == 0) + if(oldf % 4 == 0) Sys_Printf("%i", f / 4); else Sys_Printf ("."); @@ -418,20 +423,29 @@ void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int)) ======================================================================= */ -#if defined(__linux__) || defined(__APPLE__) +#if defined(__linux__) || (defined(__APPLE__) && !MAC_STATIC_HACK) #define USED -int numthreads = 4; +#include + +int numthreads = -1; void ThreadSetDefault (void) { if (numthreads == -1) // not set manually { - /* default to one thread, only multi-thread when specifically told to */ - numthreads = 1; +#ifdef _SC_NPROCESSORS_ONLN + long cpus = sysconf(_SC_NPROCESSORS_ONLN); + if (cpus > 0) + numthreads = cpus; + else +#endif + /* can't detect, so default to four threads */ + numthreads = 4; } - if(numthreads > 1) - Sys_Printf("threads: %d\n", numthreads); + + if(numthreads > 1) + Sys_Printf("threads: %d\n", numthreads); } #include @@ -520,7 +534,9 @@ RunThreadsOn void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int)) { pthread_mutexattr_t mattrib; + pthread_attr_t attr; pthread_t work_threads[MAX_THREADS]; + size_t stacksize; int start, end; int i=0, status=0; @@ -531,6 +547,14 @@ void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int)) dispatch = 0; oldf = -1; workcount = workcnt; + + pthread_attr_init(&attr); + if(pthread_attr_setstacksize(&attr, 8388608) != 0) + { + stacksize = 0; + pthread_attr_getstacksize(&attr, &stacksize); + Sys_Printf("Could not set a per-thread stack size of 8 MB, using only %.2f MB\n", stacksize / 1048576.0); + } if(numthreads == 1) func(0); @@ -550,7 +574,7 @@ void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int)) for (i=0 ; i