Changeset 3668
- Timestamp:
- 04/06/05 20:54:17 (4 years ago)
- Files:
-
- branches/2.2/src/ChangeLog.Meadow (modified) (1 diff)
- branches/2.2/src/alloc.c (modified) (19 diffs)
- branches/2.2/src/lisp.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/2.2/src/ChangeLog.Meadow
r3667 r3668 1 2005-04-06 MIYOSHI Masanori <miyoshi@meadowy.org> 2 3 * alloc.c (FLOAT_BLOCK_SIZE): Sync up with Emacs CVS HEAD. 4 (FLOAT_BLOCK_SIZE): New macro. 5 (GETMARKBIT): Ditto. 6 (SETMARKBIT): Ditto. 7 (UNSETMARKBIT): Ditto. 8 (FLOAT_BLOCK): Ditto. 9 (FLOAT_INDEX): Ditto. 10 (struct float_block): Sync up with Emacs CVS HEAD. 11 (FLOAT_MARKED_P): Ditto. 12 (FLOAT_MARK): Ditto. 13 (FLOAT_UNMARK): Ditto. 14 (make_float): Ditto. 15 (mark_object): Ditto. 16 (pdump_block_table): New structure. 17 (PDUMP_BLOCK_HASH_SIZE): New macro. 18 (pdump_block): New structure. 19 (pdump_block_hash_value): New function. 20 (pdump_put_block_hash): Ditto. 21 (pdump_get_block_hash): Ditto. 22 (initialize_block_hash): Ditto. 23 (pdump_register_object): calculate a special offset for 24 PDUMP_FLOAT. 25 (pdump_write_objects): The codes related with PDUMP_FLOAT are 26 removed. 27 (pdump): Initialize `pdump_block_hash'. 28 (pdump): Wirte float blocks. 29 (pdump): Destruct memories for `pdump_block_hash'. 30 (PDUMP_RELOCATE): Consider space for `float_block'. 31 (pdump_load): Load float blocks. 32 (pdump_relocate_objects): The codes related with Lisp_Float are 33 removed. 34 (unmark_pdumped_objects): Sync up with Emacs CVS HEAD. 35 36 * lisp.h: Sync up with Emacs CVS HEAD. a member variable `type' is 37 removed. 38 1 39 2005-04-03 MIYOSHI Masanori <miyoshi@meadowy.org> 2 40 branches/2.2/src/alloc.c
r3667 r3668 2473 2473 any new float cells from the latest float_block. */ 2474 2474 2475 #define FLOAT_BLOCK_SIZE \ 2476 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float)) 2475 #define FLOAT_BLOCK_SIZE \ 2476 (((BLOCK_BYTES - sizeof (struct float_block *) \ 2477 /* The compiler might add padding at the end. */ \ 2478 - (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \ 2479 / (sizeof (struct Lisp_Float) * CHAR_BIT + 1)) 2480 2481 #define GETMARKBIT(block,n) \ 2482 (((block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ 2483 >> ((n) % (sizeof(int) * CHAR_BIT))) \ 2484 & 1) 2485 2486 #define SETMARKBIT(block,n) \ 2487 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ 2488 |= 1 << ((n) % (sizeof(int) * CHAR_BIT)) 2489 2490 #define UNSETMARKBIT(block,n) \ 2491 (block)->gcmarkbits[(n) / (sizeof(int) * CHAR_BIT)] \ 2492 &= ~(1 << ((n) % (sizeof(int) * CHAR_BIT))) 2493 2494 #define FLOAT_BLOCK(fptr) \ 2495 ((struct float_block *)(((EMACS_UINT)(fptr)) & ~(BLOCK_ALIGN - 1))) 2496 2497 #define FLOAT_INDEX(fptr) \ 2498 ((((EMACS_UINT)(fptr)) & (BLOCK_ALIGN - 1)) / sizeof (struct Lisp_Float)) 2477 2499 2478 2500 struct float_block … … 2480 2502 /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job. */ 2481 2503 struct Lisp_Float floats[FLOAT_BLOCK_SIZE]; 2504 int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)]; 2482 2505 struct float_block *next; 2483 2506 }; 2484 2507 2485 2508 #define FLOAT_MARKED_P(fptr) \ 2486 (XMARKBIT ((fptr)->type))2509 GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) 2487 2510 2488 2511 #define FLOAT_MARK(fptr) \ 2489 (XMARK ((fptr)->type))2512 SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) 2490 2513 2491 2514 #define FLOAT_UNMARK(fptr) \ 2492 (XUNMARK ((fptr)->type))2515 UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) 2493 2516 2494 2517 /* Current float_block. */ … … 2556 2579 MEM_TYPE_FLOAT); 2557 2580 new->next = float_block; 2581 bzero ((char *) new->gcmarkbits, sizeof new->gcmarkbits); 2558 2582 float_block = new; 2559 2583 float_block_index = 0; … … 5096 5120 5097 5121 loop: 5098 XUNMARK (obj);5099 5122 5100 5123 #ifndef PDUMP … … 5150 5173 5151 5174 #endif /* not GC_CHECK_MARKED_OBJECTS */ 5175 5176 switch (SWITCH_ENUM_CAST (XGCTYPE (obj))) 5177 { 5178 case Lisp_Int: 5179 case Lisp_Misc: 5180 case Lisp_Float: 5181 break; 5182 5183 case Lisp_Symbol: 5184 case Lisp_String: 5185 case Lisp_Vectorlike: 5186 case Lisp_Cons: 5187 XUNMARK (obj); 5188 break; 5189 default: 5190 XUNMARK (obj); 5191 break; 5192 } 5152 5193 5153 5194 switch (SWITCH_ENUM_CAST (XGCTYPE (obj))) … … 6117 6158 } pdump_forward_hash_table; 6118 6159 6160 6161 typedef struct pdump_block_table 6162 { 6163 void *block; 6164 int block_index; 6165 int n_blocks; 6166 } pdump_block_table; 6167 6119 6168 /* Struct to hold root object data. */ 6120 6169 typedef struct pdump_root … … 6136 6185 #define PDUMP_HASH_TABLE_SIZE 7 /* for Lisp_Hash_Table */ 6137 6186 #define PDUMP_OFFSET 12289 6187 #define PDUMP_BLOCK_HASH_SIZE 71 6138 6188 6139 6189 static pdump_forward **pdump_hash; … … 6341 6391 } 6342 6392 6393 /* Struct to hold a element of blocks in a hash table. */ 6394 typedef struct pdump_block 6395 { 6396 void *obj; 6397 int block_index; 6398 int element_index; 6399 struct pdump_block *next; 6400 } pdump_block; 6401 6402 static pdump_block **pdump_block_hash; 6403 6404 /* calculate hash value for Lisp_Object */ 6405 static int 6406 pdump_block_hash_value (void *obj) 6407 { 6408 return ((unsigned long) obj >> 3) % PDUMP_BLOCK_HASH_SIZE; 6409 } 6410 6411 /* put given Lisp_Object to pdump_block_hash */ 6412 static void 6413 pdump_put_block_hash (void *obj, int block_index, int element_index) 6414 { 6415 int idx = pdump_block_hash_value (obj); 6416 pdump_block **prev = &pdump_block_hash[idx]; 6417 pdump_block *f = pdump_block_hash[idx]; 6418 6419 while (f != 0) 6420 { 6421 if (f->obj == obj) 6422 return; 6423 prev = &(*prev)->next; 6424 f = f->next; 6425 } 6426 f = (pdump_block *) xmalloc (sizeof (*f)); 6427 f->obj = obj; 6428 f->block_index = block_index; 6429 f->element_index = element_index; 6430 f->next = NULL; 6431 *prev = f; 6432 } 6433 6434 /* retrieve pdump_forward entry of given Lisp_Object */ 6435 static pdump_block * 6436 pdump_get_block_hash (void *obj) 6437 { 6438 pdump_block *f = pdump_block_hash[pdump_block_hash_value (obj)]; 6439 6440 while (f != 0) 6441 { 6442 if (f->obj == obj) 6443 return f; 6444 f = f->next; 6445 } 6446 return 0; 6447 } 6448 6449 static void 6450 initialize_block_hash (void) 6451 { 6452 struct float_block *p = float_block; 6453 int n = float_block_index; 6454 int i, j = 0; 6455 6456 while (p) 6457 { 6458 for (i = 0; i < n; i++) 6459 { 6460 pdump_put_block_hash ((void *) &p->floats[i], j, i); 6461 } 6462 p = p->next; 6463 n = FLOAT_BLOCK_SIZE; 6464 j++; 6465 } 6466 } 6467 6468 static unsigned long 6469 pdump_float_blocks_size (void) 6470 { 6471 return sizeof (struct float_block) * n_float_blocks + sizeof (pdump_block); 6472 } 6473 6343 6474 /* Register given object for pdump_hash and pdump_lisp_object[type] */ 6344 6475 static void … … 6347 6478 { 6348 6479 assert (pdump_get_hash (obj) == 0); 6349 pdump_put_hash (obj, pdump_lisp_object[type].size, size); 6350 pdump_lisp_object[type].size += size; 6351 pdump_lisp_object[type].objects[pdump_lisp_object[type].index++] = obj; 6352 if (pdump_lisp_object[type].index > pdump_lisp_object[type].objects_size) 6353 { 6354 pdump_lisp_object[type].objects_size *= 2; 6355 pdump_lisp_object[type].objects = 6356 xrealloc (pdump_lisp_object[type].objects, 6357 sizeof (Lisp_Object) * pdump_lisp_object[type].objects_size); 6480 6481 switch (type) 6482 { 6483 case PDUMP_FLOAT: 6484 { 6485 pdump_block *pb = pdump_get_block_hash (XFLOAT (obj)); 6486 unsigned long offset; 6487 6488 offset = (pb->block_index * sizeof (struct float_block) 6489 + pb->element_index * sizeof (struct Lisp_Float)); 6490 pdump_put_hash (obj, offset, size); 6491 } 6492 break; 6493 6494 default: 6495 pdump_put_hash (obj, pdump_lisp_object[type].size, size); 6496 pdump_lisp_object[type].size += size; 6497 pdump_lisp_object[type].objects[pdump_lisp_object[type].index++] = obj; 6498 if (pdump_lisp_object[type].index > pdump_lisp_object[type].objects_size) 6499 { 6500 pdump_lisp_object[type].objects_size *= 2; 6501 pdump_lisp_object[type].objects = 6502 xrealloc (pdump_lisp_object[type].objects, 6503 sizeof (Lisp_Object) * pdump_lisp_object[type].objects_size); 6504 } 6505 break; 6358 6506 } 6359 6507 } … … 6745 6893 6746 6894 addr = f->offset + PDUMP_OFFSET + sizeof (pdump_header_type); 6747 for (i = 0; i < type; i++) 6748 addr += pdump_lisp_object[i].size; 6895 switch (type) 6896 { 6897 case PDUMP_FLOAT: 6898 for (i = 0; i < PDUMP_OBJECT_LIMIT; i++) 6899 addr += pdump_lisp_object[i].size; 6900 break; 6901 6902 default: 6903 for (i = 0; i < type; i++) 6904 addr += pdump_lisp_object[i].size; 6905 break; 6906 } 6749 6907 XSET (new_obj, XTYPE (obj), addr); 6750 6908 return new_obj; … … 6881 7039 fwrite (&new, size, 1, pdump_stream); 6882 7040 } 6883 for (i = 0; i < pdump_lisp_object[PDUMP_FLOAT].index; i++)6884 {6885 Lisp_Object obj = pdump_lisp_object[PDUMP_FLOAT].objects[i];6886 int size = sizeof (struct Lisp_Float);6887 fwrite (XFLOAT (obj), size, 1, pdump_stream);6888 }6889 7041 for (i = 0; i < pdump_lisp_object[PDUMP_HASH_TABLE].index; i ++) 6890 7042 { … … 7048 7200 bzero (pdump_hash_table, sizeof (*pdump_hash_table) * PDUMP_HASH_TABLE_SIZE); 7049 7201 7202 pdump_block_hash = (pdump_block **) 7203 xmalloc (sizeof (*pdump_block_hash) * PDUMP_BLOCK_HASH_SIZE); 7204 bzero (pdump_block_hash, sizeof (*pdump_block_hash) * PDUMP_BLOCK_HASH_SIZE); 7205 initialize_block_hash (); 7206 7050 7207 pdump_stream = fopen ("emacs.dmp", "w"); 7051 7208 … … 7098 7255 header.hash_table_length, header.hash_table_size, 7099 7256 header.vector_length, header.vector_size)); 7257 7258 /* write float blocks */ 7259 { 7260 struct float_block *p = float_block; 7261 unsigned long offset = PDUMP_OFFSET + sizeof (pdump_header_type); 7262 struct pdump_block_table bt; 7263 7264 for (i = 0; i < PDUMP_OBJECT_LIMIT; i++) 7265 offset += pdump_lisp_object[i].size; 7266 7267 bt.block = (struct float_block *) offset; 7268 bt.block_index = float_block_index; 7269 bt.n_blocks = n_float_blocks; 7270 7271 while (p) 7272 { 7273 struct float_block fb = *p; 7274 7275 if (fb.next) 7276 fb.next = (struct float_block *) (offset 7277 + sizeof (struct float_block)); 7278 fwrite (&fb, sizeof (fb), 1, pdump_stream); 7279 p = p->next; 7280 offset += sizeof (struct float_block); 7281 } 7282 fwrite (&bt, sizeof (bt), 1, pdump_stream); 7283 } 7100 7284 7101 7285 /* write misc */ … … 7204 7388 xfree (pdump_hash); 7205 7389 7390 for (i = 0; i < PDUMP_BLOCK_HASH_SIZE; i++) 7391 { 7392 pdump_block *f = pdump_block_hash[i], *next; 7393 7394 while (f != 0) 7395 { 7396 next = f->next; 7397 xfree (f); 7398 f = next; 7399 } 7400 } 7401 xfree (pdump_block_hash); 7402 7206 7403 #ifdef PDUMP_DEBUG 7207 7404 assert (pure_bytes_used == 0); … … 7215 7412 if (! INTEGERP (obj) \ 7216 7413 && pdump_objects_start <= p_r_ptr \ 7217 && p_r_ptr < pdump_objects_start + pdump_header.objects_size) \ 7414 && (p_r_ptr < pdump_objects_start + pdump_header.objects_size \ 7415 + pdump_float_blocks_size ())) \ 7218 7416 XSET ((obj), XTYPE (obj), p_r_ptr); \ 7219 7417 } \ … … 7481 7679 PDUMP_MESSAGE (("Loading root objects... \n")); 7482 7680 lseek (fd, pdump_header.objects_size + sizeof (pdump_header_type), SEEK_SET); 7681 7682 /* load float blocks */ 7683 { 7684 struct float_block fb, *p; 7685 struct pdump_block_table bt; 7686 int count = 0; 7687 7688 do 7689 { 7690 read (fd, &fb, sizeof (fb)); 7691 } 7692 while (fb.next); 7693 7694 read (fd, &bt, sizeof (bt)); 7695 float_block = (struct float_block * )((unsigned long) bt.block 7696 + offset); 7697 float_block_index = bt.block_index; 7698 n_float_blocks = bt.n_blocks; 7699 7700 /* relocation */ 7701 p = float_block; 7702 while (p) 7703 { 7704 if (p->next) 7705 p->next = (struct float_block * ) ((unsigned long) p->next + offset); 7706 p = p->next; 7707 } 7708 } 7709 7483 7710 for (staticidx = 0; staticidx < pdump_header.root_objects_length; staticidx++) 7484 7711 { … … 7730 7957 obj_ptr += sizeof (struct Lisp_Symbol); 7731 7958 } 7732 for (i = 0; i < pdump_header.float_length; i++)7733 obj_ptr += sizeof (struct Lisp_Float);7734 7959 for (i = 0; i < pdump_header.hash_table_length; i ++) 7735 7960 obj_ptr += PDUMP_LISP_HASH_TABLE_SIZE; … … 7764 7989 { 7765 7990 struct Lisp_Cons *ptr = (struct Lisp_Cons *) obj_ptr; 7766 if ( XMARKBIT (ptr->car))7767 XUNMARK (ptr->car);7991 if (CONS_MARKED_P (ptr)) 7992 CONS_UNMARK (ptr); 7768 7993 obj_ptr += sizeof (struct Lisp_Cons); 7769 7994 } … … 7840 8065 assert (pdump_object_start_address (PDUMP_FLOAT) == obj_ptr); 7841 8066 #endif 7842 for (i = 0; i < pdump_header.float_length; i++) 7843 { 7844 struct Lisp_Float *ptr = (struct Lisp_Float *)obj_ptr; 7845 if (XMARKBIT (ptr->type)) 7846 XUNMARK (ptr->type); 7847 obj_ptr += sizeof (struct Lisp_Float); 7848 } 8067 { 8068 struct float_block *p = float_block; 8069 int n = float_block_index; 8070 int i; 8071 8072 while (p) 8073 { 8074 for (i = 0; i < n; i++) 8075 { 8076 if (FLOAT_MARKED_P (&p->floats[i])) 8077 FLOAT_UNMARK (&p->floats[i]); 8078 } 8079 p = p->next; 8080 n = FLOAT_BLOCK_SIZE; 8081 } 8082 } 8083 7849 8084 #ifdef PDUMP_DEBUG 7850 8085 assert (pdump_object_start_address (PDUMP_HASH_TABLE) == obj_ptr); branches/2.2/src/lisp.h
r3667 r3668 1287 1287 struct Lisp_Float 1288 1288 { 1289 Lisp_Object type; /* essentially used for mark-bit1290 and chaining when on free-list */1291 1289 #ifdef HIDE_LISP_IMPLEMENTATION 1292 1290 double data_;
