[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