Mercurial > emacs
comparison src/alloc.c @ 52473:a3fd06a8c844
(init_intervals, init_symbol, init_marker): Don't preallocate anything.
(Fgarbage_collect, mark_object): Ignore the markbit.
| author | Stefan Monnier <monnier@iro.umontreal.ca> |
|---|---|
| date | Thu, 11 Sep 2003 22:18:00 +0000 |
| parents | 62fcd311bb98 |
| children | 8256390b71bb |
comparison
equal
deleted
inserted
replaced
| 52472:30a3237237e0 | 52473:a3fd06a8c844 |
|---|---|
| 1129 /* Initialize interval allocation. */ | 1129 /* Initialize interval allocation. */ |
| 1130 | 1130 |
| 1131 static void | 1131 static void |
| 1132 init_intervals () | 1132 init_intervals () |
| 1133 { | 1133 { |
| 1134 interval_block | 1134 interval_block = NULL; |
| 1135 = (struct interval_block *) lisp_malloc (sizeof *interval_block, | 1135 interval_block_index = INTERVAL_BLOCK_SIZE; |
| 1136 MEM_TYPE_NON_LISP); | |
| 1137 interval_block->next = 0; | |
| 1138 bzero ((char *) interval_block->intervals, sizeof interval_block->intervals); | |
| 1139 interval_block_index = 0; | |
| 1140 interval_free_list = 0; | 1136 interval_free_list = 0; |
| 1141 n_interval_blocks = 1; | 1137 n_interval_blocks = 0; |
| 1142 } | 1138 } |
| 1143 | 1139 |
| 1144 | 1140 |
| 1145 /* Return a new interval. */ | 1141 /* Return a new interval. */ |
| 1146 | 1142 |
| 2766 /* Initialize symbol allocation. */ | 2762 /* Initialize symbol allocation. */ |
| 2767 | 2763 |
| 2768 void | 2764 void |
| 2769 init_symbol () | 2765 init_symbol () |
| 2770 { | 2766 { |
| 2771 symbol_block = (struct symbol_block *) lisp_malloc (sizeof *symbol_block, | 2767 symbol_block = NULL; |
| 2772 MEM_TYPE_SYMBOL); | 2768 symbol_block_index = SYMBOL_BLOCK_SIZE; |
| 2773 symbol_block->next = 0; | |
| 2774 bzero ((char *) symbol_block->symbols, sizeof symbol_block->symbols); | |
| 2775 symbol_block_index = 0; | |
| 2776 symbol_free_list = 0; | 2769 symbol_free_list = 0; |
| 2777 n_symbol_blocks = 1; | 2770 n_symbol_blocks = 0; |
| 2778 } | 2771 } |
| 2779 | 2772 |
| 2780 | 2773 |
| 2781 DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0, | 2774 DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0, |
| 2782 doc: /* Return a newly allocated uninterned symbol whose name is NAME. | 2775 doc: /* Return a newly allocated uninterned symbol whose name is NAME. |
| 2852 int n_marker_blocks; | 2845 int n_marker_blocks; |
| 2853 | 2846 |
| 2854 void | 2847 void |
| 2855 init_marker () | 2848 init_marker () |
| 2856 { | 2849 { |
| 2857 marker_block = (struct marker_block *) lisp_malloc (sizeof *marker_block, | 2850 marker_block = NULL; |
| 2858 MEM_TYPE_MISC); | 2851 marker_block_index = MARKER_BLOCK_SIZE; |
| 2859 marker_block->next = 0; | |
| 2860 bzero ((char *) marker_block->markers, sizeof marker_block->markers); | |
| 2861 marker_block_index = 0; | |
| 2862 marker_free_list = 0; | 2852 marker_free_list = 0; |
| 2863 n_marker_blocks = 1; | 2853 n_marker_blocks = 0; |
| 2854 fprintf(stderr, "union Lisp_Misc = %d\n", sizeof (union Lisp_Misc)); | |
| 2864 } | 2855 } |
| 2865 | 2856 |
| 2866 /* Return a newly allocated Lisp_Misc object, with no substructure. */ | 2857 /* Return a newly allocated Lisp_Misc object, with no substructure. */ |
| 2867 | 2858 |
| 2868 Lisp_Object | 2859 Lisp_Object |
| 4393 | 4384 |
| 4394 gc_in_progress = 1; | 4385 gc_in_progress = 1; |
| 4395 | 4386 |
| 4396 /* clear_marks (); */ | 4387 /* clear_marks (); */ |
| 4397 | 4388 |
| 4398 /* Mark all the special slots that serve as the roots of accessibility. | 4389 /* Mark all the special slots that serve as the roots of accessibility. */ |
| 4399 | |
| 4400 Usually the special slots to mark are contained in particular structures. | |
| 4401 Then we know no slot is marked twice because the structures don't overlap. | |
| 4402 In some cases, the structures point to the slots to be marked. | |
| 4403 For these, we use MARKBIT to avoid double marking of the slot. */ | |
| 4404 | 4390 |
| 4405 for (i = 0; i < staticidx; i++) | 4391 for (i = 0; i < staticidx; i++) |
| 4406 mark_object (*staticvec[i]); | 4392 mark_object (*staticvec[i]); |
| 4407 | 4393 |
| 4408 #if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \ | 4394 #if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \ |
| 4411 #else | 4397 #else |
| 4412 { | 4398 { |
| 4413 register struct gcpro *tail; | 4399 register struct gcpro *tail; |
| 4414 for (tail = gcprolist; tail; tail = tail->next) | 4400 for (tail = gcprolist; tail; tail = tail->next) |
| 4415 for (i = 0; i < tail->nvars; i++) | 4401 for (i = 0; i < tail->nvars; i++) |
| 4416 if (!XMARKBIT (tail->var[i])) | 4402 mark_object (tail->var[i]); |
| 4417 { | |
| 4418 mark_object (tail->var[i]); | |
| 4419 XMARK (tail->var[i]); | |
| 4420 } | |
| 4421 } | 4403 } |
| 4422 #endif | 4404 #endif |
| 4423 | 4405 |
| 4424 mark_byte_stack (); | 4406 mark_byte_stack (); |
| 4425 for (bind = specpdl; bind != specpdl_ptr; bind++) | 4407 for (bind = specpdl; bind != specpdl_ptr; bind++) |
| 4437 mark_object (handler->handler); | 4419 mark_object (handler->handler); |
| 4438 mark_object (handler->var); | 4420 mark_object (handler->var); |
| 4439 } | 4421 } |
| 4440 for (backlist = backtrace_list; backlist; backlist = backlist->next) | 4422 for (backlist = backtrace_list; backlist; backlist = backlist->next) |
| 4441 { | 4423 { |
| 4442 if (!XMARKBIT (*backlist->function)) | 4424 mark_object (*backlist->function); |
| 4443 { | 4425 |
| 4444 mark_object (*backlist->function); | |
| 4445 XMARK (*backlist->function); | |
| 4446 } | |
| 4447 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY) | 4426 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY) |
| 4448 i = 0; | 4427 i = 0; |
| 4449 else | 4428 else |
| 4450 i = backlist->nargs - 1; | 4429 i = backlist->nargs - 1; |
| 4451 for (; i >= 0; i--) | 4430 for (; i >= 0; i--) |
| 4452 if (!XMARKBIT (backlist->args[i])) | 4431 mark_object (backlist->args[i]); |
| 4453 { | |
| 4454 mark_object (backlist->args[i]); | |
| 4455 XMARK (backlist->args[i]); | |
| 4456 } | |
| 4457 } | 4432 } |
| 4458 mark_kboards (); | 4433 mark_kboards (); |
| 4459 | 4434 |
| 4460 /* Look thru every buffer's undo list | 4435 /* Look thru every buffer's undo list |
| 4461 for elements that update markers that were not marked, | 4436 for elements that update markers that were not marked, |
| 4517 | 4492 |
| 4518 #if (GC_MARK_STACK == GC_USE_GCPROS_AS_BEFORE \ | 4493 #if (GC_MARK_STACK == GC_USE_GCPROS_AS_BEFORE \ |
| 4519 || GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES) | 4494 || GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES) |
| 4520 { | 4495 { |
| 4521 register struct gcpro *tail; | 4496 register struct gcpro *tail; |
| 4522 | |
| 4523 for (tail = gcprolist; tail; tail = tail->next) | |
| 4524 for (i = 0; i < tail->nvars; i++) | |
| 4525 XUNMARK (tail->var[i]); | |
| 4526 } | 4497 } |
| 4527 #endif | 4498 #endif |
| 4528 | 4499 |
| 4529 unmark_byte_stack (); | 4500 unmark_byte_stack (); |
| 4530 for (backlist = backtrace_list; backlist; backlist = backlist->next) | |
| 4531 { | |
| 4532 XUNMARK (*backlist->function); | |
| 4533 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY) | |
| 4534 i = 0; | |
| 4535 else | |
| 4536 i = backlist->nargs - 1; | |
| 4537 for (; i >= 0; i--) | |
| 4538 XUNMARK (backlist->args[i]); | |
| 4539 } | |
| 4540 VECTOR_UNMARK (&buffer_defaults); | 4501 VECTOR_UNMARK (&buffer_defaults); |
| 4541 VECTOR_UNMARK (&buffer_local_symbols); | 4502 VECTOR_UNMARK (&buffer_local_symbols); |
| 4542 | 4503 |
| 4543 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0 | 4504 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0 |
| 4544 dump_zombies (); | 4505 dump_zombies (); |
| 4719 struct mem_node *m; | 4680 struct mem_node *m; |
| 4720 #endif | 4681 #endif |
| 4721 int cdr_count = 0; | 4682 int cdr_count = 0; |
| 4722 | 4683 |
| 4723 loop: | 4684 loop: |
| 4724 XUNMARK (obj); | |
| 4725 | 4685 |
| 4726 if (PURE_POINTER_P (XPNTR (obj))) | 4686 if (PURE_POINTER_P (XPNTR (obj))) |
| 4727 return; | 4687 return; |
| 4728 | 4688 |
| 4729 last_marked[last_marked_index++] = obj; | 4689 last_marked[last_marked_index++] = obj; |
