return -1;
}
- f = 10*dispatch / workcount;
- if (f != oldf)
+ f = 40*dispatch / workcount;
+ if(f < oldf)
{
+ Sys_Printf("warning: progress went backwards (should never happen)\n");
oldf = f;
+ }
+ while(f > oldf)
+ {
+ ++oldf;
if (pacifier)
{
- Sys_Printf ("%i...", f);
+ if(oldf % 4 == 0)
+ Sys_Printf("%i", f / 4);
+ else
+ Sys_Printf (".");
fflush( stdout ); /* ydnar */
}
}
=======================================================================
*/
-#if defined(__linux__) || defined(__APPLE__)
+#if defined(__linux__) || (defined(__APPLE__) && !MAC_STATIC_HACK)
#define USED
-int numthreads = 4;
+#include <unistd.h>
+
+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 <pthread.h>
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;
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);
for (i=0 ; i<numthreads ; i++)
{
/* Default pthread attributes: joinable & non-realtime scheduling */
- if(pthread_create(&work_threads[i], NULL, (void*)func, (void*)i) != 0)
+ if(pthread_create(&work_threads[i], &attr, (void*)func, (void*)(size_t)i) != 0)
Error("pthread_create failed");
}
for (i=0 ; i<numthreads ; i++)