aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2010-11-16 19:10:29 +0000
committerMike Frysinger <vapier@gentoo.org>2010-11-16 19:10:29 +0000
commit6ab5626b08f37bc5b84c67d0f25e363e0ab0180e (patch)
treef0fb7655dd741470c3f88e3e4c8f625c01908232
parent6fc6ea198c7feb48e378a490f5d227d625a340e4 (diff)
downloadbinutils-6ab5626b08f37bc5b84c67d0f25e363e0ab0180e.zip
binutils-6ab5626b08f37bc5b84c67d0f25e363e0ab0180e.tar.gz
binutils-6ab5626b08f37bc5b84c67d0f25e363e0ab0180e.tar.bz2
sim: dv-sockser: add a write buffer variant
Rather than having to bang out chunks of data one byte at a time over the socket interface, add a write variant that accepts an arbitrarily long buffer. This speeds things up considerably when we have many chars to send out at once. Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r--sim/common/ChangeLog6
-rw-r--r--sim/common/dv-sockser.c15
-rw-r--r--sim/common/dv-sockser.h1
3 files changed, 18 insertions, 4 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index 6cb313b..d6dc022 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -1,3 +1,9 @@
+2010-11-16 Mike Frysinger <vapier@gentoo.org>
+
+ * dv-sockser.c (dv_sockser_write_buffer): New function.
+ (dv_sockser_write): Rewrite to use dv_sockser_write_buffer.
+ * dv-sockser.h (dv_sockser_write_buffer): New prototype.
+
2010-10-07 Hans-Peter Nilsson <hp@axis.com>
* callback.c (os_lseek): Call wrap on lseek result.
diff --git a/sim/common/dv-sockser.c b/sim/common/dv-sockser.c
index b09d9c9..f6fd389 100644
--- a/sim/common/dv-sockser.c
+++ b/sim/common/dv-sockser.c
@@ -346,13 +346,14 @@ dv_sockser_status (SIM_DESC sd)
}
int
-dv_sockser_write (SIM_DESC sd, unsigned char c)
+dv_sockser_write_buffer (SIM_DESC sd, const unsigned char *buffer,
+ unsigned nr_bytes)
{
int n;
if (! connected_p (sd))
return -1;
- n = write (sockser_fd, &c, 1);
+ n = write (sockser_fd, buffer, nr_bytes);
if (n == -1)
{
if (errno == EPIPE)
@@ -362,9 +363,15 @@ dv_sockser_write (SIM_DESC sd, unsigned char c)
}
return -1;
}
- if (n != 1)
+ if (n != nr_bytes)
return -1;
- return 1;
+ return nr_bytes;
+}
+
+int
+dv_sockser_write (SIM_DESC sd, unsigned char c)
+{
+ return dv_sockser_write_buffer (sd, &c, 1);
}
int
diff --git a/sim/common/dv-sockser.h b/sim/common/dv-sockser.h
index 209cf46..0ad071a 100644
--- a/sim/common/dv-sockser.h
+++ b/sim/common/dv-sockser.h
@@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* FIXME: later add a device ptr arg */
extern int dv_sockser_status (SIM_DESC);
int dv_sockser_write (SIM_DESC, unsigned char);
+int dv_sockser_write_buffer (SIM_DESC, const unsigned char *, unsigned);
int dv_sockser_read (SIM_DESC);
#endif /* DV_SOCKSER_H */