This is the mail archive of the rda@sources.redhat.com mailing list for the rda project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] rda/samples: improve memory allocation, ver. 1.1


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);
  	}
      }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]