]> git.mxchange.org Git - flightgear.git/commitdiff
Tie the Scenery loader thread and the real weather fetching thread to CPU1 (if suppor...
authorehofman <ehofman>
Sun, 9 Jan 2005 10:27:01 +0000 (10:27 +0000)
committerehofman <ehofman>
Sun, 9 Jan 2005 10:27:01 +0000 (10:27 +0000)
src/Environment/environment_ctrl.cxx
src/Main/bootstrap.cxx
src/Scenery/FGTileLoader.cxx

index d021172ebdf5e1c4f1c75116eec5e98013216ea3..0e7a6db371d44b3ba79224ce1e9b0ea362e1fa8f 100644 (file)
@@ -329,7 +329,7 @@ FGMetarEnvironmentCtrl::FGMetarEnvironmentCtrl ()
 {
 #if defined(ENABLE_THREADS) && ENABLE_THREADS
     thread = new MetarThread(this);
-    thread->start();
+    thread->start( 1 );
 #endif // ENABLE_THREADS
 }
 
index 5f2b24a54f149ee568cdf07996e26e331dcd64a5..452e026f91d1240339bc491ae14b7b925c099bf0 100644 (file)
@@ -116,18 +116,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 
 #if defined( sgi )
 #include <sys/fpu.h>
+#include <sys/sysmp.h>
 
 /*
-    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
index 255e76b85bb117ee7314999ebb235b406fa35476..1ca949f3be9f48b9842595032b8fc1e9aa1556b7 100644 (file)
@@ -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
 }