comparison src/alloc.c @ 83548:c71725faff1a

Merged from emacs@sv.gnu.org. Last-minute emacsclient rewrites be damned! Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-490 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-491 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-492 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-493 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-494 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-495 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-496 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-497 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-498 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-499 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-500 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-501 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-502 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-503 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-504 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-505 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-506 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-507 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-508 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-509 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-510 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-511 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-512 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-513 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-514 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-515 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-516 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-517 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-518 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-519 Update from CVS: etc/TUTORIAL.cn: Updated. * emacs@sv.gnu.org/emacs--devo--0--patch-520 Merge from erc--emacs--22 * emacs@sv.gnu.org/emacs--devo--0--patch-521 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-522 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-523 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-524 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-525 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-526 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-527 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-528 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-529 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-530 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-531 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-532 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-533 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-534 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-535 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-161 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-162 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-163 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-164 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-165 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-166 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-167 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-168 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-169 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-170 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-588
author Karoly Lorentey <lorentey@elte.hu>
date Sun, 03 Dec 2006 15:03:30 +0000
parents 6b25ef5cc276 b684c6771753
children b8d9a391daf3
comparison
equal deleted inserted replaced
83547:0912b745fc75 83548:c71725faff1a
478 static int live_cons_p P_ ((struct mem_node *, void *)); 478 static int live_cons_p P_ ((struct mem_node *, void *));
479 static int live_symbol_p P_ ((struct mem_node *, void *)); 479 static int live_symbol_p P_ ((struct mem_node *, void *));
480 static int live_float_p P_ ((struct mem_node *, void *)); 480 static int live_float_p P_ ((struct mem_node *, void *));
481 static int live_misc_p P_ ((struct mem_node *, void *)); 481 static int live_misc_p P_ ((struct mem_node *, void *));
482 static void mark_maybe_object P_ ((Lisp_Object)); 482 static void mark_maybe_object P_ ((Lisp_Object));
483 static void mark_memory P_ ((void *, void *)); 483 static void mark_memory P_ ((void *, void *, int));
484 static void mem_init P_ ((void)); 484 static void mem_init P_ ((void));
485 static struct mem_node *mem_insert P_ ((void *, void *, enum mem_type)); 485 static struct mem_node *mem_insert P_ ((void *, void *, enum mem_type));
486 static void mem_insert_fixup P_ ((struct mem_node *)); 486 static void mem_insert_fixup P_ ((struct mem_node *));
487 static void mem_rotate_left P_ ((struct mem_node *)); 487 static void mem_rotate_left P_ ((struct mem_node *));
488 static void mem_rotate_right P_ ((struct mem_node *)); 488 static void mem_rotate_right P_ ((struct mem_node *));
4328 mark_object (obj); 4328 mark_object (obj);
4329 } 4329 }
4330 } 4330 }
4331 4331
4332 4332
4333 /* Mark Lisp objects referenced from the address range START..END. */ 4333 /* Mark Lisp objects referenced from the address range START+OFFSET..END
4334 or END+OFFSET..START. */
4334 4335
4335 static void 4336 static void
4336 mark_memory (start, end) 4337 mark_memory (start, end, offset)
4337 void *start, *end; 4338 void *start, *end;
4339 int offset;
4338 { 4340 {
4339 Lisp_Object *p; 4341 Lisp_Object *p;
4340 void **pp; 4342 void **pp;
4341 4343
4342 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES 4344 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4351 start = end; 4353 start = end;
4352 end = tem; 4354 end = tem;
4353 } 4355 }
4354 4356
4355 /* Mark Lisp_Objects. */ 4357 /* Mark Lisp_Objects. */
4356 for (p = (Lisp_Object *) start; (void *) p < end; ++p) 4358 for (p = (Lisp_Object *) ((char *) start + offset); (void *) p < end; ++p)
4357 mark_maybe_object (*p); 4359 mark_maybe_object (*p);
4358 4360
4359 /* Mark Lisp data pointed to. This is necessary because, in some 4361 /* Mark Lisp data pointed to. This is necessary because, in some
4360 situations, the C compiler optimizes Lisp objects away, so that 4362 situations, the C compiler optimizes Lisp objects away, so that
4361 only a pointer to them remains. Example: 4363 only a pointer to them remains. Example:
4372 4374
4373 Here, `obj' isn't really used, and the compiler optimizes it 4375 Here, `obj' isn't really used, and the compiler optimizes it
4374 away. The only reference to the life string is through the 4376 away. The only reference to the life string is through the
4375 pointer `s'. */ 4377 pointer `s'. */
4376 4378
4377 for (pp = (void **) start; (void *) pp < end; ++pp) 4379 for (pp = (void **) ((char *) start + offset); (void *) pp < end; ++pp)
4378 mark_maybe_pointer (*pp); 4380 mark_maybe_pointer (*pp);
4379 } 4381 }
4380 4382
4381 /* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in 4383 /* setjmp will work with GCC unless NON_SAVING_SETJMP is defined in
4382 the GCC system configuration. In gcc 3.2, the only systems for 4384 the GCC system configuration. In gcc 3.2, the only systems for
4551 4553
4552 static void 4554 static void
4553 mark_stack () 4555 mark_stack ()
4554 { 4556 {
4555 int i; 4557 int i;
4556 jmp_buf j; 4558 /* jmp_buf may not be aligned enough on darwin-ppc64 */
4559 union aligned_jmpbuf {
4560 Lisp_Object o;
4561 jmp_buf j;
4562 } j;
4557 volatile int stack_grows_down_p = (char *) &j > (char *) stack_base; 4563 volatile int stack_grows_down_p = (char *) &j > (char *) stack_base;
4558 void *end; 4564 void *end;
4559 4565
4560 /* This trick flushes the register windows so that all the state of 4566 /* This trick flushes the register windows so that all the state of
4561 the process is contained in the stack. */ 4567 the process is contained in the stack. */
4582 setjmp_tested_p = 1; 4588 setjmp_tested_p = 1;
4583 test_setjmp (); 4589 test_setjmp ();
4584 } 4590 }
4585 #endif /* GC_SETJMP_WORKS */ 4591 #endif /* GC_SETJMP_WORKS */
4586 4592
4587 setjmp (j); 4593 setjmp (j.j);
4588 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j; 4594 end = stack_grows_down_p ? (char *) &j + sizeof j : (char *) &j;
4589 #endif /* not GC_SAVE_REGISTERS_ON_STACK */ 4595 #endif /* not GC_SAVE_REGISTERS_ON_STACK */
4590 4596
4591 /* This assumes that the stack is a contiguous region in memory. If 4597 /* This assumes that the stack is a contiguous region in memory. If
4592 that's not the case, something has to be done here to iterate 4598 that's not the case, something has to be done here to iterate
4597 #else 4603 #else
4598 #define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object) 4604 #define GC_LISP_OBJECT_ALIGNMENT sizeof (Lisp_Object)
4599 #endif 4605 #endif
4600 #endif 4606 #endif
4601 for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT) 4607 for (i = 0; i < sizeof (Lisp_Object); i += GC_LISP_OBJECT_ALIGNMENT)
4602 mark_memory ((char *) stack_base + i, end); 4608 mark_memory (stack_base, end, i);
4603 /* Allow for marking a secondary stack, like the register stack on the 4609 /* Allow for marking a secondary stack, like the register stack on the
4604 ia64. */ 4610 ia64. */
4605 #ifdef GC_MARK_SECONDARY_STACK 4611 #ifdef GC_MARK_SECONDARY_STACK
4606 GC_MARK_SECONDARY_STACK (); 4612 GC_MARK_SECONDARY_STACK ();
4607 #endif 4613 #endif