From 38d327ba246cf8b51f3677982582c78af49fa7bc Mon Sep 17 00:00:00 2001 From: ehofman Date: Sun, 9 Jan 2005 10:27:01 +0000 Subject: [PATCH] Tie the Scenery loader thread and the real weather fetching thread to CPU1 (if supported). --- src/Environment/environment_ctrl.cxx | 2 +- src/Main/bootstrap.cxx | 27 +++++++++++++++++---------- src/Scenery/FGTileLoader.cxx | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/Environment/environment_ctrl.cxx b/src/Environment/environment_ctrl.cxx index d021172eb..0e7a6db37 100644 --- a/src/Environment/environment_ctrl.cxx +++ b/src/Environment/environment_ctrl.cxx @@ -329,7 +329,7 @@ FGMetarEnvironmentCtrl::FGMetarEnvironmentCtrl () { #if defined(ENABLE_THREADS) && ENABLE_THREADS thread = new MetarThread(this); - thread->start(); + thread->start( 1 ); #endif // ENABLE_THREADS } diff --git a/src/Main/bootstrap.cxx b/src/Main/bootstrap.cxx index 5f2b24a54..452e026f9 100644 --- a/src/Main/bootstrap.cxx +++ b/src/Main/bootstrap.cxx @@ -116,18 +116,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, #if defined( sgi ) #include +#include /* - set the special "flush zero" bit (FS, bit 24) in the Control Status - Register of the FPU of R4k and beyond so that the result of any - underflowing operation will be clamped to zero, and no exception of - any kind will be generated on the CPU. This has no effect on an - R3000. - - the FS bit is inherited by processes fork()ed out of this one, - but it is not inherited across an exec(). so anytime you exec() - a process, you must re-set the FS bit in that process. - */ + * set the special "flush zero" bit (FS, bit 24) in the Control Status + * Register of the FPU of R4k and beyond so that the result of any + * underflowing operation will be clamped to zero, and no exception of + * any kind will be generated on the CPU. This has no effect on an + * R3000. + */ void flush_fpe(void) { union fpc_csr f; @@ -151,6 +148,16 @@ int main ( int argc, char **argv ) { #if defined(sgi) flush_fpe(); + + // Bind all non-rendering threads to CPU1 + // This will reduce the jitter caused by them to an absolute minimum, + // but it will only work with superuser authority. + if ( geteuid() == 0 ) + { + sysmp(MP_CLOCK, 0); // bind the timer only to CPU0 + sysmp(MP_ISOLATE, 1 ); // Isolate CPU1 + sysmp(MP_NONPREEMPTIVE, 1 ); // disable process time slicing on CPU1 + } #endif // Enable floating-point exceptions for Windows diff --git a/src/Scenery/FGTileLoader.cxx b/src/Scenery/FGTileLoader.cxx index 255e76b85..1ca949f3b 100644 --- a/src/Scenery/FGTileLoader.cxx +++ b/src/Scenery/FGTileLoader.cxx @@ -45,7 +45,7 @@ FGTileLoader::FGTileLoader() for (int i = 0; i < MAX_THREADS; ++i) { threads[i] = new LoaderThread(this); - threads[i]->start(); + threads[i]->start( 1 ); } #endif // ENABLE_THREADS }