summaryrefslogtreecommitdiff
path: root/src/base/circlebuf.cc
diff options
context:
space:
mode:
authorNathan Binkert <nate@binkert.org>2008-09-19 09:42:31 -0700
committerNathan Binkert <nate@binkert.org>2008-09-19 09:42:31 -0700
commitce3d8c2b038605fa5ceb6d1ad8e27b51c1aca980 (patch)
treed1330c84f7f0a203daeab8fc7fd3c6ec37b80497 /src/base/circlebuf.cc
parentaf9c5e05f73f6899a405230e66dfa75a5b39822a (diff)
downloadgem5-ce3d8c2b038605fa5ceb6d1ad8e27b51c1aca980.tar.xz
atomicio: provide atomic read and write functions.
These functions keep trying to read and write until all data has been transferred, or an error occurrs. In the case where an end of file hasn't been reached, but all of the bytes have not been read/written, try again. On EINTR, try again.
Diffstat (limited to 'src/base/circlebuf.cc')
-rw-r--r--src/base/circlebuf.cc29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/base/circlebuf.cc b/src/base/circlebuf.cc
index a0c015671..d42bb11c3 100644
--- a/src/base/circlebuf.cc
+++ b/src/base/circlebuf.cc
@@ -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 @@ CircleBuf::dump()
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 @@ CircleBuf::read(int fd, int len)
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 @@ CircleBuf::read(int fd)
_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 @@ void
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;
}