changeset f90e36056b9e in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=f90e36056b9e
description:
        imported patch atomicio.diff

diffstat:

4 files changed, 62 insertions(+), 1 deletion(-)
src/base/atomicio.cc  |   40 ++++++++++++++++++++++++++++++++++++++++
src/base/atomicio.hh  |   19 +++++++++++++++++++
src/base/circlebuf.cc |    2 ++
src/dev/terminal.cc   |    2 +-

diffs (270 lines):

diff -r fa83ce19a383 -r f90e36056b9e src/base/SConscript
--- a/src/base/SConscript       Thu Sep 18 15:19:52 2008 -0700
+++ b/src/base/SConscript       Thu Sep 18 15:19:53 2008 -0700
@@ -31,6 +31,7 @@
 Import('*')
 
 Source('annotate.cc')
+Source('atomicio.cc')
 Source('bigint.cc')
 Source('circlebuf.cc')
 Source('cprintf.cc')
diff -r fa83ce19a383 -r f90e36056b9e src/base/atomicio.cc
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/base/atomicio.cc      Thu Sep 18 15:19:53 2008 -0700
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2008 The Hewlett-Packard Development Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Nathan Binkert
+ */
+
+#include <cerrno>
+#include <cstdio>
+
+#include "base/atomicio.hh"
+
+ssize_t
+atomic_read(int fd, void *s, size_t n)
+{
+    char *p = reinterpret_cast<char *>(s);
+    ssize_t pos = 0;
+
+    while (n > pos) {
+        ssize_t result = read(fd, p + pos, n - pos);
+        if (result == 0)
+            break;
+
+        if (result == -1) {
+            if (errno == EINTR || errno == EAGAIN)
+                continue;
+            return result;
+        }
+
+        pos += result;
+    }
+
+    return pos;
+}
+
+ssize_t
+atomic_write(int fd, const void *s, size_t n)
+{
+    const char *p = reinterpret_cast<const char *>(s);
+    ssize_t pos = 0;
+
+    while (n > pos) {
+        ssize_t result = write(fd, p + pos, n - pos);
+        if (result == 0)
+            break;
+
+        if (result == -1) {
+            if (errno == EINTR || errno == EAGAIN)
+                continue;
+            return result;
+        }
+
+        pos += result;
+    }
+
+    return pos;
+}
diff -r fa83ce19a383 -r f90e36056b9e src/base/atomicio.hh
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/base/atomicio.hh      Thu Sep 18 15:19:53 2008 -0700
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2008 The Hewlett-Packard Development Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Nathan Binkert
+ */
+
+#ifndef __BASE_ATOMICIO_HH__
+#define __BASE_ATOMICIO_HH__
+
+#include <unistd.h>
+
+ssize_t atomic_read(int fd, void *s, size_t n);
+ssize_t atomic_write(int fd, const void *s, size_t n);
+
+#endif // __BASE_ATOMICIO_HH__
diff -r fa83ce19a383 -r f90e36056b9e src/base/circlebuf.cc
--- a/src/base/circlebuf.cc     Thu Sep 18 15:19:52 2008 -0700
+++ b/src/base/circlebuf.cc     Thu Sep 18 15:19:53 2008 -0700
@@ -29,12 +29,11 @@
  */
 
 #include <algorithm>
+#include <cstdio>
+#include <cstring>
 #include <string>
 
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
+#include "base/atomicio.hh"
 #include "base/circlebuf.hh"
 #include "base/cprintf.hh"
 #include "base/intmath.hh"
@@ -59,8 +58,8 @@
     cprintf("start = %10d, stop = %10d, buflen = %10d\n",
             _start, _stop, _buflen);
     fflush(stdout);
-    ::write(STDOUT_FILENO, _buf, _buflen);
-    ::write(STDOUT_FILENO, "<\n", 2);
+    atomic_write(STDOUT_FILENO, _buf, _buflen);
+    atomic_write(STDOUT_FILENO, "<\n", 2);
 }
 
 void
@@ -106,19 +105,19 @@
 
     if (_stop > _start) {
         len = min(len, _stop - _start);
-        ::write(fd, _buf + _start, len);
+        atomic_write(fd, _buf + _start, len);
         _start += len;
     }
     else {
         int endlen = _buflen - _start;
         if (endlen > len) {
-            ::write(fd, _buf + _start, len);
+            atomic_write(fd, _buf + _start, len);
             _start += len;
         }
         else {
-            ::write(fd, _buf + _start, endlen);
+            atomic_write(fd, _buf + _start, endlen);
             _start = min(len - endlen, _stop);
-            ::write(fd, _buf, _start);
+            atomic_write(fd, _buf, _start);
         }
     }
 }
@@ -129,11 +128,11 @@
     _size = 0;
 
     if (_stop > _start) {
-        ::write(fd, _buf + _start, _stop - _start);
+        atomic_write(fd, _buf + _start, _stop - _start);
     }
     else {
-        ::write(fd, _buf + _start, _buflen - _start);
-        ::write(fd, _buf, _stop);
+        atomic_write(fd, _buf + _start, _buflen - _start);
+        atomic_write(fd, _buf, _stop);
     }
 
     _start = _stop;
@@ -159,9 +158,9 @@
 CircleBuf::readall(int fd)
 {
     if (_rollover)
-        ::write(fd, _buf + _stop, _buflen - _stop);
+        atomic_write(fd, _buf + _stop, _buflen - _stop);
 
-    ::write(fd, _buf, _stop);
+    atomic_write(fd, _buf, _stop);
     _start = _stop;
 }
 
diff -r fa83ce19a383 -r f90e36056b9e src/dev/terminal.cc
--- a/src/dev/terminal.cc       Thu Sep 18 15:19:52 2008 -0700
+++ b/src/dev/terminal.cc       Thu Sep 18 15:19:53 2008 -0700
@@ -35,16 +35,17 @@
 
 #include <sys/ioctl.h>
 #include <sys/termios.h>
-#include <sys/types.h>
 #include <errno.h>
 #include <poll.h>
 #include <unistd.h>
 
+#include <cctype>
 #include <iostream>
 #include <fstream>
 #include <sstream>
 #include <string>
 
+#include "base/atomicio.hh"
 #include "base/misc.hh"
 #include "base/output.hh"
 #include "base/socket.hh"
@@ -156,7 +157,7 @@
     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 +239,9 @@
     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;
 }
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to