Mercurial > emacs
comparison src/alloc.c @ 9437:c7d7fb56b42d
(MARKER_BLOCK_SIZE, marker_block, marker_free_list): Now refers to the
superset type, not just markers.
(allocate_misc): New function, extracted from Fmake_marker.
(Fpurecopy): Check the substructure.
(clear_marks, mark_object, gc_sweep): Likewise.
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Tue, 11 Oct 1994 07:46:01 +0000 |
| parents | 86e52a4d8d87 |
| children | a40af805e036 |
comparison
equal
deleted
inserted
replaced
| 9436:907353876b8b | 9437:c7d7fb56b42d |
|---|---|
| 731 p->next = 0; | 731 p->next = 0; |
| 732 consing_since_gc += sizeof (struct Lisp_Symbol); | 732 consing_since_gc += sizeof (struct Lisp_Symbol); |
| 733 return val; | 733 return val; |
| 734 } | 734 } |
| 735 | 735 |
| 736 /* Allocation of markers. | 736 /* Allocation of markers and other objects that share that structure. |
| 737 Works like allocation of conses. */ | 737 Works like allocation of conses. */ |
| 738 | 738 |
| 739 #define MARKER_BLOCK_SIZE \ | 739 #define MARKER_BLOCK_SIZE \ |
| 740 ((1020 - sizeof (struct marker_block *)) / sizeof (struct Lisp_Marker)) | 740 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc)) |
| 741 | 741 |
| 742 struct marker_block | 742 struct marker_block |
| 743 { | 743 { |
| 744 struct marker_block *next; | 744 struct marker_block *next; |
| 745 struct Lisp_Marker markers[MARKER_BLOCK_SIZE]; | 745 union Lisp_Misc markers[MARKER_BLOCK_SIZE]; |
| 746 }; | 746 }; |
| 747 | 747 |
| 748 struct marker_block *marker_block; | 748 struct marker_block *marker_block; |
| 749 int marker_block_index; | 749 int marker_block_index; |
| 750 | 750 |
| 751 struct Lisp_Marker *marker_free_list; | 751 union Lisp_Misc *marker_free_list; |
| 752 | 752 |
| 753 void | 753 void |
| 754 init_marker () | 754 init_marker () |
| 755 { | 755 { |
| 756 marker_block = (struct marker_block *) malloc (sizeof (struct marker_block)); | 756 marker_block = (struct marker_block *) malloc (sizeof (struct marker_block)); |
| 758 bzero (marker_block->markers, sizeof marker_block->markers); | 758 bzero (marker_block->markers, sizeof marker_block->markers); |
| 759 marker_block_index = 0; | 759 marker_block_index = 0; |
| 760 marker_free_list = 0; | 760 marker_free_list = 0; |
| 761 } | 761 } |
| 762 | 762 |
| 763 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | 763 /* Return a newly allocated Lisp_Misc object, with no substructure. */ |
| 764 "Return a newly allocated marker which does not point at any place.") | 764 Lisp_Object |
| 765 () | 765 allocate_misc () |
| 766 { | 766 { |
| 767 register Lisp_Object val; | 767 Lisp_Object val; |
| 768 register struct Lisp_Marker *p; | |
| 769 | 768 |
| 770 if (marker_free_list) | 769 if (marker_free_list) |
| 771 { | 770 { |
| 772 XSETMARKER (val, marker_free_list); | 771 XSETMISC (val, marker_free_list); |
| 773 marker_free_list | 772 marker_free_list = marker_free_list->u_free.chain; |
| 774 = (struct Lisp_Marker *) XFASTINT (marker_free_list->chain); | |
| 775 } | 773 } |
| 776 else | 774 else |
| 777 { | 775 { |
| 778 if (marker_block_index == MARKER_BLOCK_SIZE) | 776 if (marker_block_index == MARKER_BLOCK_SIZE) |
| 779 { | 777 { |
| 780 struct marker_block *new = (struct marker_block *) xmalloc (sizeof (struct marker_block)); | 778 struct marker_block *new |
| 779 = (struct marker_block *) xmalloc (sizeof (struct marker_block)); | |
| 781 VALIDATE_LISP_STORAGE (new, sizeof *new); | 780 VALIDATE_LISP_STORAGE (new, sizeof *new); |
| 782 new->next = marker_block; | 781 new->next = marker_block; |
| 783 marker_block = new; | 782 marker_block = new; |
| 784 marker_block_index = 0; | 783 marker_block_index = 0; |
| 785 } | 784 } |
| 786 XSETMARKER (val, &marker_block->markers[marker_block_index++]); | 785 XSETMISC (val, &marker_block->markers[marker_block_index++]); |
| 787 } | 786 } |
| 787 consing_since_gc += sizeof (union Lisp_Misc); | |
| 788 return val; | |
| 789 } | |
| 790 | |
| 791 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | |
| 792 "Return a newly allocated marker which does not point at any place.") | |
| 793 () | |
| 794 { | |
| 795 register Lisp_Object val; | |
| 796 register struct Lisp_Marker *p; | |
| 797 | |
| 798 val = allocate_misc (); | |
| 799 XMISC (val)->type = Lisp_Misc_Marker; | |
| 788 p = XMARKER (val); | 800 p = XMARKER (val); |
| 789 p->buffer = 0; | 801 p->buffer = 0; |
| 790 p->bufpos = 0; | 802 p->bufpos = 0; |
| 791 p->chain = Qnil; | 803 p->chain = Qnil; |
| 792 consing_since_gc += sizeof (struct Lisp_Marker); | |
| 793 return val; | 804 return val; |
| 794 } | 805 } |
| 795 | 806 |
| 796 /* Allocation of strings */ | 807 /* Allocation of strings */ |
| 797 | 808 |
| 1123 switch ((int) XTYPE (obj)) | 1134 switch ((int) XTYPE (obj)) |
| 1124 #else | 1135 #else |
| 1125 switch (XTYPE (obj)) | 1136 switch (XTYPE (obj)) |
| 1126 #endif | 1137 #endif |
| 1127 { | 1138 { |
| 1128 case Lisp_Marker: | 1139 case Lisp_Misc: |
| 1129 error ("Attempt to copy a marker to pure storage"); | 1140 switch (XMISC (obj)->type) |
| 1141 { | |
| 1142 case Lisp_Misc_Marker: | |
| 1143 error ("Attempt to copy a marker to pure storage"); | |
| 1144 | |
| 1145 default: | |
| 1146 abort (); | |
| 1147 } | |
| 1130 | 1148 |
| 1131 case Lisp_Cons: | 1149 case Lisp_Cons: |
| 1132 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr); | 1150 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr); |
| 1133 | 1151 |
| 1134 #ifdef LISP_FLOAT_TYPE | 1152 #ifdef LISP_FLOAT_TYPE |
| 1424 | 1442 |
| 1425 for (sblk = marker_block; sblk; sblk = sblk->next) | 1443 for (sblk = marker_block; sblk; sblk = sblk->next) |
| 1426 { | 1444 { |
| 1427 register int i; | 1445 register int i; |
| 1428 for (i = 0; i < lim; i++) | 1446 for (i = 0; i < lim; i++) |
| 1429 XUNMARK (sblk->markers[i].chain); | 1447 if (sblk->markers[i].type == Lisp_Misc_Marker) |
| 1448 XUNMARK (sblk->markers[i].u_marker.chain); | |
| 1430 lim = MARKER_BLOCK_SIZE; | 1449 lim = MARKER_BLOCK_SIZE; |
| 1431 } | 1450 } |
| 1432 } | 1451 } |
| 1433 /* Clear mark bits on all buffers */ | 1452 /* Clear mark bits on all buffers */ |
| 1434 { | 1453 { |
| 1611 goto loop2; | 1630 goto loop2; |
| 1612 } | 1631 } |
| 1613 } | 1632 } |
| 1614 break; | 1633 break; |
| 1615 | 1634 |
| 1616 case Lisp_Marker: | 1635 case Lisp_Misc: |
| 1617 XMARK (XMARKER (obj)->chain); | 1636 switch (XMISC (obj)->type) |
| 1618 /* DO NOT mark thru the marker's chain. | 1637 { |
| 1619 The buffer's markers chain does not preserve markers from gc; | 1638 case Lisp_Misc_Marker: |
| 1620 instead, markers are removed from the chain when freed by gc. */ | 1639 XMARK (XMARKER (obj)->chain); |
| 1640 /* DO NOT mark thru the marker's chain. | |
| 1641 The buffer's markers chain does not preserve markers from gc; | |
| 1642 instead, markers are removed from the chain when freed by gc. */ | |
| 1643 break; | |
| 1644 | |
| 1645 default: | |
| 1646 abort (); | |
| 1647 } | |
| 1621 break; | 1648 break; |
| 1622 | 1649 |
| 1623 case Lisp_Cons: | 1650 case Lisp_Cons: |
| 1624 case Lisp_Buffer_Local_Value: | 1651 case Lisp_Buffer_Local_Value: |
| 1625 case Lisp_Some_Buffer_Local_Value: | 1652 case Lisp_Some_Buffer_Local_Value: |
| 1853 | 1880 |
| 1854 for (mblk = marker_block; mblk; mblk = mblk->next) | 1881 for (mblk = marker_block; mblk; mblk = mblk->next) |
| 1855 { | 1882 { |
| 1856 register int i; | 1883 register int i; |
| 1857 for (i = 0; i < lim; i++) | 1884 for (i = 0; i < lim; i++) |
| 1858 if (!XMARKBIT (mblk->markers[i].chain)) | 1885 if (mblk->markers[i].type == Lisp_Misc_Marker) |
| 1859 { | 1886 { |
| 1860 Lisp_Object tem; | 1887 if (!XMARKBIT (mblk->markers[i].u_marker.chain)) |
| 1861 tem1 = &mblk->markers[i]; /* tem1 avoids Sun compiler bug */ | 1888 { |
| 1862 XSETMARKER (tem, tem1); | 1889 Lisp_Object tem; |
| 1863 unchain_marker (tem); | 1890 tem1 = &mblk->markers[i].u_marker; /* tem1 avoids Sun compiler bug */ |
| 1864 XSETFASTINT (mblk->markers[i].chain, (EMACS_INT) marker_free_list); | 1891 XSETMARKER (tem, tem1); |
| 1865 marker_free_list = &mblk->markers[i]; | 1892 unchain_marker (tem); |
| 1866 num_free++; | 1893 /* We could leave the type alone, since nobody checks it, |
| 1867 } | 1894 but this might catch bugs faster. */ |
| 1868 else | 1895 mblk->markers[i].type = Lisp_Misc_Free; |
| 1869 { | 1896 mblk->markers[i].u_free.chain = marker_free_list; |
| 1870 num_used++; | 1897 marker_free_list = &mblk->markers[i]; |
| 1871 XUNMARK (mblk->markers[i].chain); | 1898 num_free++; |
| 1899 } | |
| 1900 else | |
| 1901 { | |
| 1902 num_used++; | |
| 1903 XUNMARK (mblk->markers[i].u_marker.chain); | |
| 1904 } | |
| 1872 } | 1905 } |
| 1873 lim = MARKER_BLOCK_SIZE; | 1906 lim = MARKER_BLOCK_SIZE; |
| 1874 } | 1907 } |
| 1875 | 1908 |
| 1876 total_markers = num_used; | 1909 total_markers = num_used; |
