PR# 14572 Potential improvements to `add_core'

Problem Report Summary
Submitter: prestoat2000
Category: Runtime
Priority: Medium
Date: 2008/07/09
Class: Bug
Severity: Non-critical
Number: 14572
Release: 6.2.73753
Confidential: No
Status: Open
Environment: Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv: Gecko/20071111 Firefox/ Solaris 10 on SPARC
Synopsis: Potential improvements to `add_core'

Based on code inspection only, it looks like `add_core' (in malloc.c)
could be improved a bit.  It seems to me that this routine is trying
to achieve several things:

1. Add enough to requested number of bytes to allow for chunk overhead
   and Eiffel object overhead.

2. Make sure that at least `eif_chunk_size' bytes are allocated.

3. Make sure that space not including size of "struct chunk" is a
   multiple of ALIGNMAX.

4. Allocate an integral number of OS pages.

The current implementation does not achieve all of these objectives.
If `eif_chunk_size' is not a multiple of OS page size (it may have
been set by user and the code in main.c only ensures that the value is
a multiple of ALIGNMAX), it is not rounded up to next page boundary.
Also, size of "struct chunk" is added a second time.

Here are my suggestions for improvement:

A. Add minimum necessary padding to definition of "struct chunk" to guarantee
   that its size is a multiple of ALIGNMAX.  Add a check to
   runtime_validation.c to guarantee that this constraint is always
   met.  This removes the need for the code:

                /* Size of chunk has to be added, otherwise the remaining space
                 * might not be a multiple of ALIGNMAX. */
        asked += sizeof(struct chunk);

B. After increasing `asked' by "sizeof(struct chunk) + OVERHEAD" and
   making sure `asked' is at least `eif_chunk_size', make sure
   `asked' is a multiple of ALIGNMAX (whether asked <= eif_chunk_size
   or not):

                mod = asked % ALIGNMAX;
                if (mod != 0) {
                        asked += ALIGNMAX - mod;

C. We now have an `asked' value that satisfies 1, 2 and 3 above.  Now
   compute `allocated' as minimum number of OS pages to allocate to
   accomodate `asked':

        allocated = asked;
        mod = allocated % PAGESIZE_VALUE;
        if (mod != 0) {
                allocated += (PAGESIZE_VALUE - mod);

D. Local `allocated' now has amount to allocate (multiple of OS page size).
   Increase `asked' to largest value that is a multiple of ALIGNMAX but
   is <= `allocated':

        if (asked < allocated) {
                n = (allocated - asked) / ALIGNMAX;
                asked += (n * ALIGNMAX);

E. Call `eif_malloc' with `allocated'.  Figure out how to do memory
   accounting most appropriately, using `asked' and `allocated'.
   Maybe memory accounting does not need any changes.
To Reproduce

Problem Report Interactions