Mercurial > emacs
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 |
