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;