[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: address@hidden: Re: Your Emacs changes]
From: |
Glenn Morris |
Subject: |
Re: address@hidden: Re: Your Emacs changes] |
Date: |
Thu, 30 Aug 2007 23:01:14 -0400 |
User-agent: |
Gnus (www.gnus.org), GNU Emacs (www.gnu.org/software/emacs/) |
Please could you provide a ChangeLog entry for this.
> Probably the thing described at
> http://lists.gnu.org/archive/html/emacs-devel/2007-07/msg00094.html.
> Attached is the latest stuff on this.
[...]
> Index: alloc.c
> ===================================================================
> RCS file: /sources/emacs/emacs/src/alloc.c,v
> retrieving revision 1.414
> diff -u -r1.414 alloc.c
> - --- alloc.c 19 Aug 2007 00:15:26 -0000 1.414
> +++ alloc.c 21 Aug 2007 14:31:37 -0000
> @@ -5974,23 +5974,53 @@
>
> for (cblk = cons_block; cblk; cblk = *cprev)
> {
> - - register int i;
> + register int i = 0;
> int this_free = 0;
> - - for (i = 0; i < lim; i++)
> - - if (!CONS_MARKED_P (&cblk->conses[i]))
> - - {
> - - this_free++;
> - - cblk->conses[i].u.chain = cons_free_list;
> - - cons_free_list = &cblk->conses[i];
> +
> + while (1)
> + {
> + if (cblk->gcmarkbits[i] == -1)
> + {
> + /* Fast path - everything is marked. */
> + cblk->gcmarkbits[i++] = 0;
> + num_used += BITS_PER_INT;
> + }
> + else
> + {
> + /* Slow path - scan over each bit, from the beginning
> + of current word to 'min (word boundary, LIM)'. */
> + int start, stop;
> +
> + start = i * BITS_PER_INT;
> + stop = lim - start;
> + if (stop > BITS_PER_INT)
> + stop = BITS_PER_INT;
> + stop += start;
> +
> + while (start < stop)
> + {
> + if (!CONS_MARKED_P (&cblk->conses[start]))
> + {
> + this_free++;
> + cblk->conses[start].u.chain = cons_free_list;
> + cons_free_list = &cblk->conses[start];
> #if GC_MARK_STACK
> - - cons_free_list->car = Vdead;
> + cons_free_list->car = Vdead;
> #endif
> - - }
> - - else
> - - {
> - - num_used++;
> - - CONS_UNMARK (&cblk->conses[i]);
> - - }
> + }
> + else
> + {
> + num_used++;
> + CONS_UNMARK (&cblk->conses[start]);
> + }
> + start++;
> + }
> + if (stop < (++i) * BITS_PER_INT)
> + /* Whole bitmap is scanned or LIM is reached. */
> + break;
> + }
> + }
> +
> lim = CONS_BLOCK_SIZE;
> /* If this block contains only free conses and we have already
> seen more than two blocks worth of free conses then deallocate
>
> - --------------040802050101020103000601--