comparison src/dumper.c @ 3092:141c2920ea48

[xemacs-hg @ 2005-11-25 01:41:31 by crestani] Incremental Garbage Collector
author crestani
date Fri, 25 Nov 2005 01:42:08 +0000
parents ec5f23ea6d2e
children 503174cac05a
comparison
equal deleted inserted replaced
3091:c22d8984148c 3092:141c2920ea48
684 backtrace[me].position = 0; 684 backtrace[me].position = 0;
685 backtrace[me].offset = 0; 685 backtrace[me].offset = 0;
686 } 686 }
687 687
688 static void pdump_register_object (Lisp_Object obj); 688 static void pdump_register_object (Lisp_Object obj);
689 #ifdef NEW_GC
690 static void pdump_register_object_array (Lisp_Object data,
691 Bytecount size,
692 const struct memory_description *desc,
693 int count);
694 #endif /* NEW_GC */
689 static void pdump_register_block_contents (const void *data, 695 static void pdump_register_block_contents (const void *data,
690 Bytecount size, 696 Bytecount size,
691 const struct memory_description * 697 const struct memory_description *
692 desc, 698 desc,
693 int count); 699 int count);
779 (const Rawbyte *) pobj - (const Rawbyte *) data; 785 (const Rawbyte *) pobj - (const Rawbyte *) data;
780 pdump_register_object (dobj); 786 pdump_register_object (dobj);
781 } 787 }
782 break; 788 break;
783 } 789 }
790 #ifdef NEW_GC
791 case XD_LISP_OBJECT_BLOCK_PTR:
792 {
793 EMACS_INT count = lispdesc_indirect_count (desc1->data1, desc,
794 data);
795 const struct sized_memory_description *sdesc =
796 lispdesc_indirect_description (data, desc1->data2.descr);
797 const Lisp_Object *pobj = (const Lisp_Object *) rdata;
798 if (pobj)
799 pdump_register_object_array
800 (*pobj, sdesc->size, sdesc->description, count);
801 break;
802 }
803 #endif /* NEW_GC */
784 case XD_BLOCK_PTR: 804 case XD_BLOCK_PTR:
785 { 805 {
786 EMACS_INT count = lispdesc_indirect_count (desc1->data1, desc, 806 EMACS_INT count = lispdesc_indirect_count (desc1->data1, desc,
787 data); 807 data);
788 const struct sized_memory_description *sdesc = 808 const struct sized_memory_description *sdesc =
874 stderr_out ("Undumpable object type : %s\n", imp->name); 894 stderr_out ("Undumpable object type : %s\n", imp->name);
875 pdump_backtrace (); 895 pdump_backtrace ();
876 } 896 }
877 } 897 }
878 898
899 #ifdef NEW_GC
900 static void
901 pdump_register_object_array (Lisp_Object obj,
902 Bytecount size,
903 const struct memory_description *desc,
904 int count)
905 {
906 struct lrecord_header *objh;
907 const struct lrecord_implementation *imp;
908
909 if (!POINTER_TYPE_P (XTYPE (obj)))
910 return;
911
912 objh = XRECORD_LHEADER (obj);
913 if (!objh)
914 return;
915
916 if (pdump_get_block (objh))
917 return;
918
919 imp = LHEADER_IMPLEMENTATION (objh);
920
921 if (imp->description
922 && RECORD_DUMPABLE (objh))
923 {
924 pdump_bump_depth ();
925 backtrace[pdump_depth - 1].obj = objh;
926 pdump_add_block (pdump_object_table + objh->type,
927 objh, lispdesc_block_size_1 (objh, size, desc), count);
928 pdump_register_block_contents (objh, size, desc, count);
929 --pdump_depth;
930 }
931 else
932 {
933 pdump_alert_undump_object[objh->type]++;
934 stderr_out ("Undumpable object type : %s\n", imp->name);
935 pdump_backtrace ();
936 }
937 }
938 #endif /* NEW_GC */
939
879 /* Register the referenced objects in the array of COUNT blocks located at 940 /* Register the referenced objects in the array of COUNT blocks located at
880 DATA; each block is described by SIZE and DESC. "Block" here simply 941 DATA; each block is described by SIZE and DESC. "Block" here simply
881 means any block of memory. 942 means any block of memory.
882 943
883 This does not register the block of memory itself; it may, for 944 This does not register the block of memory itself; it may, for
992 EMACS_INT val = lispdesc_indirect_count (desc1->data1, desc, 1053 EMACS_INT val = lispdesc_indirect_count (desc1->data1, desc,
993 orig_data); 1054 orig_data);
994 * (int *) rdata = val; 1055 * (int *) rdata = val;
995 break; 1056 break;
996 } 1057 }
1058 #ifdef NEW_GC
1059 case XD_LISP_OBJECT_BLOCK_PTR:
1060 #endif /* NEW_GC */
997 case XD_OPAQUE_DATA_PTR: 1061 case XD_OPAQUE_DATA_PTR:
998 case XD_ASCII_STRING: 1062 case XD_ASCII_STRING:
999 case XD_BLOCK_PTR: 1063 case XD_BLOCK_PTR:
1000 { 1064 {
1001 void *ptr = * (void **) rdata; 1065 void *ptr = * (void **) rdata;
1171 1235
1172 for (i=0; i<lrecord_type_count; i++) 1236 for (i=0; i<lrecord_type_count; i++)
1173 if (pdump_object_table[i].align == align) 1237 if (pdump_object_table[i].align == align)
1174 for (elt = pdump_object_table[i].first; elt; elt = elt->next) 1238 for (elt = pdump_object_table[i].first; elt; elt = elt->next)
1175 { 1239 {
1240 #ifndef NEW_GC
1176 assert (elt->count == 1); 1241 assert (elt->count == 1);
1242 #endif /* not NEW_GC */
1177 f (elt, lrecord_implementations_table[i]->description); 1243 f (elt, lrecord_implementations_table[i]->description);
1178 } 1244 }
1179 } 1245 }
1180 } 1246 }
1181 1247
1232 case XD_HASHCODE: 1298 case XD_HASHCODE:
1233 case XD_INT: 1299 case XD_INT:
1234 case XD_LONG: 1300 case XD_LONG:
1235 case XD_INT_RESET: 1301 case XD_INT_RESET:
1236 break; 1302 break;
1303 #ifdef NEW_GC
1304 case XD_LISP_OBJECT_BLOCK_PTR:
1305 #endif /* NEW_GC */
1237 case XD_OPAQUE_DATA_PTR: 1306 case XD_OPAQUE_DATA_PTR:
1238 case XD_ASCII_STRING: 1307 case XD_ASCII_STRING:
1239 case XD_BLOCK_PTR: 1308 case XD_BLOCK_PTR:
1240 case XD_LO_LINK: 1309 case XD_LO_LINK:
1241 { 1310 {
1250 1319
1251 assert (desc1->data1 == 0); 1320 assert (desc1->data1 == 0);
1252 1321
1253 if (POINTER_TYPE_P (XTYPE (*pobj)) 1322 if (POINTER_TYPE_P (XTYPE (*pobj))
1254 && ! EQ (*pobj, Qnull_pointer)) 1323 && ! EQ (*pobj, Qnull_pointer))
1255 *pobj = wrap_pointer_1 ((char *) pdump_get_mc_addr 1324 *pobj = wrap_pointer_1 ((Rawbyte *) pdump_get_mc_addr
1256 (XPNTR (*pobj))); 1325 (XPNTR (*pobj)));
1257 break; 1326 break;
1258 } 1327 }
1259 case XD_LISP_OBJECT_ARRAY: 1328 case XD_LISP_OBJECT_ARRAY:
1260 { 1329 {
1266 { 1335 {
1267 Lisp_Object *pobj = (Lisp_Object *) rdata + j; 1336 Lisp_Object *pobj = (Lisp_Object *) rdata + j;
1268 1337
1269 if (POINTER_TYPE_P (XTYPE (*pobj)) 1338 if (POINTER_TYPE_P (XTYPE (*pobj))
1270 && ! EQ (*pobj, Qnull_pointer)) 1339 && ! EQ (*pobj, Qnull_pointer))
1271 *pobj = wrap_pointer_1 ((char *) pdump_get_mc_addr 1340 *pobj = wrap_pointer_1 ((Rawbyte *) pdump_get_mc_addr
1272 (XPNTR (*pobj))); 1341 (XPNTR (*pobj)));
1273 } 1342 }
1274 break; 1343 break;
1275 } 1344 }
1276 case XD_DOC_STRING: 1345 case XD_DOC_STRING:
1685 rt.count = pdump_object_table[i].count; 1754 rt.count = pdump_object_table[i].count;
1686 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt); 1755 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt);
1687 while (elt) 1756 while (elt)
1688 { 1757 {
1689 EMACS_INT rdata = pdump_get_block (elt->obj)->save_offset; 1758 EMACS_INT rdata = pdump_get_block (elt->obj)->save_offset;
1759 #ifdef NEW_GC
1760 int j;
1761 for (j=0; j<elt->count; j++)
1762 {
1763 PDUMP_WRITE_ALIGNED (EMACS_INT, rdata);
1764 rdata += elt->size;
1765 }
1766 #else /* not NEW_GC */
1690 PDUMP_WRITE_ALIGNED (EMACS_INT, rdata); 1767 PDUMP_WRITE_ALIGNED (EMACS_INT, rdata);
1768 #endif /* not NEW_GC */
1691 elt = elt->next; 1769 elt = elt->next;
1692 } 1770 }
1693 } 1771 }
1694 1772
1695 rt.desc = 0; 1773 rt.desc = 0;
2134 Rawbyte *p; 2212 Rawbyte *p;
2135 EMACS_INT delta; 2213 EMACS_INT delta;
2136 EMACS_INT count; 2214 EMACS_INT count;
2137 pdump_header *header = (pdump_header *) pdump_start; 2215 pdump_header *header = (pdump_header *) pdump_start;
2138 2216
2217 #ifdef NEW_GC
2218 /* This is a DEFVAR_BOOL and gets dumped, but the actual value was
2219 already determined by vdb_install_signal_handler () in
2220 vdb-mprotect.c, which could be different from the value in the
2221 dump file. So store it here and restore it after loading the dump
2222 file. */
2223 int allow_inc_gc = allow_incremental_gc;
2224 #endif /* NEW_GC */
2139 pdump_end = pdump_start + pdump_length; 2225 pdump_end = pdump_start + pdump_length;
2140 2226
2141 delta = ((EMACS_INT) pdump_start) - header->reloc_address; 2227 delta = ((EMACS_INT) pdump_start) - header->reloc_address;
2142 p = pdump_start + header->stab_offset; 2228 p = pdump_start + header->stab_offset;
2143 2229
2161 if (i == 0) 2247 if (i == 0)
2162 { 2248 {
2163 Bytecount real_size = size * elt_count; 2249 Bytecount real_size = size * elt_count;
2164 if (count == 2) 2250 if (count == 2)
2165 { 2251 {
2166 mc_addr = (Rawbyte *) mc_alloc (real_size); 2252 if (elt_count <= 1)
2253 mc_addr = (Rawbyte *) mc_alloc (real_size);
2254 #ifdef NEW_GC
2255 else
2256 mc_addr = (Rawbyte *) mc_alloc_array (size, elt_count);
2257 #endif /* NEW_GC */
2167 #ifdef ALLOC_TYPE_STATS 2258 #ifdef ALLOC_TYPE_STATS
2168 inc_lrecord_stats (real_size, 2259 inc_lrecord_stats (real_size,
2169 (const struct lrecord_header *) 2260 (const struct lrecord_header *)
2170 ((char *) rdata + delta)); 2261 ((Rawbyte *) rdata + delta));
2171 if (((const struct lrecord_header *)
2172 ((char *) rdata + delta))->type
2173 == lrecord_type_string)
2174 inc_lrecord_string_data_stats
2175 (((Lisp_String *) ((char *) rdata + delta))->size_);
2176 #endif /* ALLOC_TYPE_STATS */ 2262 #endif /* ALLOC_TYPE_STATS */
2177 } 2263 }
2178 else 2264 else
2179 mc_addr = (Rawbyte *) xmalloc_and_zero (real_size); 2265 mc_addr = (Rawbyte *) xmalloc_and_zero (real_size);
2180 } 2266 }
2181 else 2267 else
2182 mc_addr += size; 2268 mc_addr += size;
2183 2269
2184 pdump_put_mc_addr ((void *) rdata, (EMACS_INT) mc_addr); 2270 pdump_put_mc_addr ((void *) rdata, (EMACS_INT) mc_addr);
2185 memcpy (mc_addr, (char *) rdata + delta, size); 2271 memcpy (mc_addr, (Rawbyte *) rdata + delta, size);
2186 } 2272 }
2187 } 2273 }
2188 else if (!(--count)) 2274 else if (!(--count))
2189 break; 2275 break;
2190 } 2276 }
2215 { 2301 {
2216 pdump_reloc_table rt = PDUMP_READ_ALIGNED (p, pdump_reloc_table); 2302 pdump_reloc_table rt = PDUMP_READ_ALIGNED (p, pdump_reloc_table);
2217 p = (Rawbyte *) ALIGN_PTR (p, Rawbyte *); 2303 p = (Rawbyte *) ALIGN_PTR (p, Rawbyte *);
2218 if (rt.desc) 2304 if (rt.desc)
2219 { 2305 {
2220 char **reloc = (char **) p; 2306 Rawbyte **reloc = (Rawbyte **) p;
2221 for (i = 0; i < rt.count; i++) 2307 for (i = 0; i < rt.count; i++)
2222 { 2308 {
2223 reloc[i] = (char *) pdump_get_mc_addr (reloc[i]); 2309 reloc[i] = (Rawbyte *) pdump_get_mc_addr (reloc[i]);
2224 pdump_reloc_one_mc (reloc[i], rt.desc); 2310 pdump_reloc_one_mc (reloc[i], rt.desc);
2225 } 2311 }
2226 p += rt.count * sizeof (char *); 2312 p += rt.count * sizeof (Rawbyte *);
2227 } 2313 }
2228 else if (!(--count)) 2314 else if (!(--count))
2229 break; 2315 break;
2230 } 2316 }
2231 #endif /* MC_ALLOC */ 2317 #endif /* MC_ALLOC */
2317 } 2403 }
2318 2404
2319 #ifdef MC_ALLOC 2405 #ifdef MC_ALLOC
2320 xfree (pdump_mc_hash, mc_addr_elt *); 2406 xfree (pdump_mc_hash, mc_addr_elt *);
2321 #endif /* MC_ALLOC */ 2407 #endif /* MC_ALLOC */
2408
2409 #ifdef NEW_GC
2410 allow_incremental_gc = allow_inc_gc;
2411 #endif /* NEW_GC */
2322 2412
2323 return 1; 2413 return 1;
2324 } 2414 }
2325 2415
2326 #ifdef WIN32_NATIVE 2416 #ifdef WIN32_NATIVE