]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/bootstrap.cxx
- implement progress information (enabled by default; can be turned off via
[flightgear.git] / src / Main / bootstrap.cxx
index 743fc611aa0bf0b06ad5c51705d1fb227a5bd729..efedf8657289e4d8794409139c8b788b79718318 100644 (file)
@@ -2,7 +2,7 @@
 //
 // Written by Curtis Olson, started May 1997.
 //
-// Copyright (C) 1997 - 2002  Curtis L. Olson  - curt@flightgear.org
+// Copyright (C) 1997 - 2002  Curtis L. Olson  - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -31,6 +31,7 @@
 #endif
 
 #include <stdlib.h>
+#include <stdio.h>
 
 #include <simgear/compiler.h>
 #include <simgear/structure/exception.hxx>
@@ -115,18 +116,16 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 
 #if defined( sgi )
 #include <sys/fpu.h>
+#include <sys/sysmp.h>
+#include <unistd.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;
@@ -150,6 +149,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
@@ -188,7 +197,9 @@ int main ( int argc, char **argv ) {
                             // disabled.
         cerr << "Fatal error: " << t.getFormattedMessage()
              << "\n (received from " << t.getOrigin() << ')' << endl;
-        exit(1);
+    } catch (...) {
+        cerr << "Unknown exception in the main loop. Aborting..." << endl;
+        perror("Possible cause");
     }
 
     return 0;
@@ -201,7 +212,6 @@ void fgExitCleanup() {
     if (_bootstrap_OSInit != 0)
         fgSetMouseCursor(MOUSE_CURSOR_POINTER);
 
-    if (globals)
-        delete globals;
+    delete globals;
 }