This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] rda/samples: improve memory allocation, ver. 1.1
- From: Michael Snyder <msnyder at redhat dot com>
- To: Andrew Cagney <cagney at gnu dot org>
- Cc: gdb-patches at sources dot redhat dot com, binutils at sources dot redhat dot com, rda at sources dot redhat dot com, Michael Elizabeth Chastain <mec dot gnu at mindspring dot com>
- Date: Mon, 12 Jul 2004 23:53:14 +0000
- Subject: [RFA] rda/samples: improve memory allocation, ver. 1.1
- Organization: Red Hat, Inc.
Resubmitted with corrections from Michael C.:
2004-07-09 Michael Snyder <msnyder@redhat.com>
* samples/demo-target.c (demo_set_thread_mem): Allocate new
simulated memory in hunks, rather than one byte at a time.
If target_mem.base moves down, copy contents up.
Index: demo-target.c
===================================================================
RCS file: /cvs/src/src/rda/samples/demo-target.c,v
retrieving revision 1.1
diff -p -r1.1 demo-target.c
*** demo-target.c 28 Aug 2002 01:22:28 -0000 1.1
--- demo-target.c 12 Jul 2004 23:47:54 -0000
*************** demo_get_mem (struct gdbserv* serv,
*** 384,389 ****
--- 384,392 ----
return n;
}
+ #define ALLOC_UNIT 0x1000
+ #define alloc_roundup(LEN) ((((LEN)+ALLOC_UNIT-1) / ALLOC_UNIT) * ALLOC_UNIT)
+
static long
demo_set_thread_mem (struct gdbserv *serv,
*************** demo_set_thread_mem (struct gdbserv *ser
*** 397,419 ****
gdbserv_reg_to_ulong (serv, addr, &request_base);
if (target_mem.len == 0)
{
! target_mem.buf = malloc (len);
! target_mem.len = len;
! gdbserv_reg_to_ulong (serv, addr, &target_mem.base);
}
else
{
if (request_base < target_mem.base)
{
! target_mem.len += target_mem.base - request_base;
target_mem.base = request_base;
target_mem.buf = realloc (target_mem.buf, target_mem.len);
}
if (request_base + len >
target_mem.base + target_mem.len)
{
! target_mem.len +=
! (request_base + len) - (target_mem.base + target_mem.len);
target_mem.buf = realloc (target_mem.buf, target_mem.len);
}
}
--- 400,426 ----
gdbserv_reg_to_ulong (serv, addr, &request_base);
if (target_mem.len == 0)
{
! target_mem.len = alloc_roundup (len);
! target_mem.buf = malloc (target_mem.len);
! target_mem.base = request_base;
}
else
{
if (request_base < target_mem.base)
{
! unsigned long oldlen = target_mem.len;
! unsigned long movlen = target_mem.base - request_base;
!
! target_mem.len += alloc_roundup (target_mem.base - request_base);
target_mem.base = request_base;
target_mem.buf = realloc (target_mem.buf, target_mem.len);
+ memmove (target_mem.buf + movlen, target_mem.buf, oldlen);
}
if (request_base + len >
target_mem.base + target_mem.len)
{
! target_mem.len += alloc_roundup ((request_base + len) -
! (target_mem.base + target_mem.len));
target_mem.buf = realloc (target_mem.buf, target_mem.len);
}
}