https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80721

--- Comment #3 from Markus Eisenmann <meisenmann....@fh-salzburg.ac.at> ---
Hi Richard!

And now a less-intrusive (suggested) patch to do also a "right" merge
[Sorry, also udiff-like but not fully formatted/with line-info; to see "my"
idea]

----
          free_entry **fe;
          for (fe = &first_free_entry;
               (*fe)->next
               && (reinterpret_cast <char *> ((*fe)->next)
                   > reinterpret_cast <char *> (e) + sz);
               fe = &(*fe)->next)
            ;
+         // If the next/right block follows immediately to the end of the
block
+         // to free, add its size to current 'free' and unlink it from the
list.
+         if (reinterpret_cast <char *> (e) + sz
+             == reinterpret_cast <char *> ((*fe)->next))
+         {
+           sz += ((*fe)->next)->size;
+           (*fe)->next = ((*fe)->next)->next;
+         }
          if (reinterpret_cast <char *> (*fe) + (*fe)->size
              == reinterpret_cast <char *> (e))
            /* Merge with the freelist entry.  */
            (*fe)->size += sz;
----

Best regards from Salzburg,
Markus

P.S.: Should I add a (well-formatted) patch-file, containing these two
proposals?

Reply via email to