Thread: Use inherited baseCpu rather than cpu in SimpleThread
[gem5.git] / src / dev / terminal.cc
index 58371a2bdb1c82b85cab49eeca16e9c6b11f0c1b..a11d45554eaa4716b159946410d3f2d3d51c5497 100644 (file)
 
 #include <sys/ioctl.h>
 #include <sys/termios.h>
-#include <sys/types.h>
-#include <errno.h>
 #include <poll.h>
 #include <unistd.h>
 
-#include <iostream>
+#include <cctype>
+#include <cerrno>
 #include <fstream>
+#include <iostream>
 #include <sstream>
 #include <string>
 
+#include "base/atomicio.hh"
 #include "base/misc.hh"
 #include "base/output.hh"
 #include "base/socket.hh"
 #include "base/trace.hh"
+#include "debug/Terminal.hh"
+#include "debug/TerminalVerbose.hh"
 #include "dev/platform.hh"
 #include "dev/terminal.hh"
 #include "dev/uart.hh"
@@ -99,6 +102,9 @@ Terminal::Terminal(const Params *p)
 {
     if (p->output) {
         outfile = simout.find(p->name);
+        if (!outfile)
+            outfile = simout.create(p->name);
+
         outfile->setf(ios::unitbuf);
     }
 
@@ -156,7 +162,7 @@ Terminal::accept()
     int fd = listener.accept(true);
     if (data_fd != -1) {
         char message[] = "terminal already attached!\n";
-        ::write(fd, message, sizeof(message));
+        atomic_write(fd, message, sizeof(message));
         ::close(fd);
         return;
     }
@@ -238,16 +244,9 @@ Terminal::write(const uint8_t *buf, size_t len)
     if (data_fd < 0)
         panic("Terminal not properly attached.\n");
 
-    size_t ret;
-    for (;;) {
-      ret = ::write(data_fd, buf, len);
-
-      if (ret >= 0)
-        break;
-
-      if (errno != EINTR)
-      detach();
-    }
+    ssize_t ret = atomic_write(data_fd, buf, len);
+    if (ret < len)
+        detach();
 
     return ret;
 }
@@ -260,17 +259,13 @@ Terminal::write(const uint8_t *buf, size_t len)
 uint8_t
 Terminal::in()
 {
-    bool empty;
     uint8_t c;
 
-    empty = rxbuf.empty();
-    assert(!empty);
+    assert(!rxbuf.empty());
     rxbuf.read((char *)&c, 1);
-    empty = rxbuf.empty();
-
 
     DPRINTF(TerminalVerbose, "in: \'%c\' %#02x more: %d\n",
-            isprint(c) ? c : ' ', c, !empty);
+            isprint(c) ? c : ' ', c, !rxbuf.empty());
 
     return c;
 }
@@ -300,8 +295,7 @@ Terminal::out(char c)
     if (DTRACE(Terminal)) {
         static char last = '\0';
 
-        if (c != '\n' && c != '\r' ||
-            last != '\n' && last != '\r') {
+        if ((c != '\n' && c != '\r') || (last != '\n' && last != '\r')) {
             if (c == '\n' || c == '\r') {
                 int size = linebuf.size();
                 char *buffer = new char[size + 1];