[Orxonox-commit 1453] r6171 - code/branches/presentation2/src/libraries/core

scheusso at orxonox.net scheusso at orxonox.net
Fri Nov 27 12:30:29 CET 2009


Author: scheusso
Date: 2009-11-27 12:30:29 +0100 (Fri, 27 Nov 2009)
New Revision: 6171

Modified:
   code/branches/presentation2/src/libraries/core/IOConsole.cc
   code/branches/presentation2/src/libraries/core/IOConsole.h
Log:
fixed problem with ioconsole not restoring terminal settings when a segfault/sigabrt/etc occured


Modified: code/branches/presentation2/src/libraries/core/IOConsole.cc
===================================================================
--- code/branches/presentation2/src/libraries/core/IOConsole.cc	2009-11-26 22:29:20 UTC (rev 6170)
+++ code/branches/presentation2/src/libraries/core/IOConsole.cc	2009-11-27 11:30:29 UTC (rev 6171)
@@ -50,7 +50,7 @@
         if (!text->empty())
         {
             level = (*text)[0];
-            if (level == -1 || level >= 1 && level <= 6)
+            if (level == -1 || (level >= 1 && level <= 6))
             {
                 *text = text->substr(1);
                 if (level != -1)
@@ -116,6 +116,8 @@
 
 namespace orxonox
 {
+    termios* IOConsole::originalTerminalSettings_s = 0;
+    
     namespace EscapeMode
     {
         enum Value
@@ -132,7 +134,6 @@
         , cout_(std::cout.rdbuf())
         , bStatusPrinted_(false)
         , promptString_("orxonox # ")
-        , originalTerminalSettings_(new termios())
     {
         this->setTerminalMode();
         this->shell_->registerListener(this);
@@ -167,7 +168,6 @@
         this->cout_ << "\033[" << this->statusLineWidths_.size() << 'T';
 
         resetTerminalMode();
-        delete this->originalTerminalSettings_;
         this->shell_->destroy();
 
         // Restore this->cout_ redirection
@@ -368,19 +368,26 @@
     void IOConsole::setTerminalMode()
     {
         termios new_settings;
+        IOConsole::originalTerminalSettings_s = new termios();
 
-        tcgetattr(0, this->originalTerminalSettings_);
-        new_settings = *this->originalTerminalSettings_;
+        tcgetattr(0, this->originalTerminalSettings_s);
+        new_settings = *this->originalTerminalSettings_s;
         new_settings.c_lflag &= ~(ICANON | ECHO);
         //new_settings.c_lflag |= (ISIG | IEXTEN);
         new_settings.c_cc[VTIME] = 0;
         new_settings.c_cc[VMIN]  = 0;
         tcsetattr(0, TCSANOW, &new_settings);
+        atexit(&IOConsole::resetTerminalMode);
     }
 
-    void IOConsole::resetTerminalMode()
+    /*static*/ void IOConsole::resetTerminalMode()
     {
-        tcsetattr(0, TCSANOW, IOConsole::originalTerminalSettings_);
+        if(IOConsole::originalTerminalSettings_s)
+        {
+            tcsetattr(0, TCSANOW, IOConsole::originalTerminalSettings_s);
+            delete IOConsole::originalTerminalSettings_s;
+            IOConsole::originalTerminalSettings_s = 0;
+        }
     }
 
     void IOConsole::getTerminalSize()

Modified: code/branches/presentation2/src/libraries/core/IOConsole.h
===================================================================
--- code/branches/presentation2/src/libraries/core/IOConsole.h	2009-11-26 22:29:20 UTC (rev 6170)
+++ code/branches/presentation2/src/libraries/core/IOConsole.h	2009-11-27 11:30:29 UTC (rev 6171)
@@ -59,7 +59,7 @@
 
     private:
         void setTerminalMode();
-        void resetTerminalMode();
+        static void resetTerminalMode();
         void getTerminalSize();
         bool willPrintStatusLines();
         int extractLogLevel(std::string* text);
@@ -92,7 +92,7 @@
         static const unsigned   minOutputLines_ = 3;
 
 #ifdef ORXONOX_PLATFORM_UNIX
-        termios*                originalTerminalSettings_;
+        static termios*         originalTerminalSettings_s;
 #elif defined(ORXONOX_PLATFORM_WINDOWS)
         void moveCursor(int dx, int dy);
         void moveCursorYAndHome(int dy);




More information about the Orxonox-commit mailing list