From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4097 invoked by alias); 9 Jul 2004 21:39:56 -0000 Mailing-List: contact rda-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Post: List-Help: , Sender: rda-owner@sources.redhat.com Received: (qmail 4075 invoked from network); 9 Jul 2004 21:39:55 -0000 Message-ID: <40EF10A8.5060403@redhat.com> Date: Fri, 09 Jul 2004 21:39:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.4.2) Gecko/20040301 X-Accept-Language: en-us, en MIME-Version: 1.0 To: gdb-patches@sources.redhat.com, rda@sources.redhat.com, binutils@sources.redhat.com, Andrew Cagney Subject: [RFA] rda/samples: improve memory allocation Content-Type: multipart/mixed; boundary="------------040203030307010308090006" X-SW-Source: 2004-q3/txt/msg00003.txt.bz2 This is a multi-part message in MIME format. --------------040203030307010308090006 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 173 Two problems with existing code: 1) Grows the simulated memory one byte at a time, and 2) If target_mem.base ever moves down, doesn't compensate by moving the contents up. --------------040203030307010308090006 Content-Type: text/plain; name="diff5" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diff5" Content-length: 2499 2004-07-09 Michael Snyder * 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/cvsfiles/devo/rda/samples/demo-target.c,v retrieving revision 1.19 diff -p -r1.19 demo-target.c *** demo-target.c 21 Aug 2002 22:43:14 -0000 1.19 --- demo-target.c 9 Jul 2004 21:30:22 -0000 *************** demo_get_mem (struct gdbserv* serv, *** 385,390 **** --- 385,393 ---- return n; } + #define ALLOC_UNIT 0x1000; + #define alloc_roundup(LEN) ((LEN / ALLOC_UNIT) + ALLOC_UNIT) + static long demo_set_thread_mem (struct gdbserv *serv, *************** demo_set_thread_mem (struct gdbserv *ser *** 398,420 **** 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); } } --- 401,427 ---- 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); } } --------------040203030307010308090006--