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.
+
+
+ * samples/demo-target.c (demo_target): Call malloc only once,
+ so that gdb can detach and re-attach repeatedly.
+
* lib/gdbserv-target.c (gdbserv_fromtarget_terminate): Rename
parameter from exitval to sigval (it's a signal number).
* lib/gdbserv-target.c (gdbserv_totarget): Comment spelling fix.
struct gdbserv_target *
demo_target (struct gdbserv *serv, void *context)
{
- struct gdbserv_target *target;
+ static struct gdbserv_target *target = NULL;
if (sole_connection != NULL)
{
fprintf (stderr, "Accepted gdb connection.\n");
sole_connection = serv;
- target = malloc (sizeof (struct gdbserv_target));
+ if (target == NULL)
+ target = malloc (sizeof (struct gdbserv_target));
memset (target, sizeof (*target), 0);
/* Callback structure for function pointers that handle processed
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,
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);
+ 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)
{
- target_mem.len += target_mem.base - request_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 +=
- (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);
}
}