Changeset 3676

Show
Ignore:
Timestamp:
04/10/05 17:51:25 (4 years ago)
Author:
miyoshi
Message:

* lisp.h (struct Lisp_Float): New member `gcmarkbit'. This is a
hack for portable dumper.

* alloc.c (FLOAT_BLOCK_SIZE): Undo the last change.
(GETMARKBIT): Removed.
(SETMARKBIT): Ditto.
(UNSETMARKBIT): Ditto.
(FLOAT_BLOCK): Ditto.
(FLOAT_INDEX): Ditto.
(struct float_block): Undo the last change.
(FLOAT_MARKED_P): Refer to `gcmarkbit'. This is a hack for
portable dumper.
(FLOAT_MARK): Ditto.
(FLOAT_UNMARK): Ditto.
(make_float): Initialize the allocated memory to clean up
`gcmarkbit'.
(PDUMP_BLOCK_HASH_SIZE): Removed.
(struct pdump_block): Removed.
(pdump_block_hash): Ditto.
(pdump_block_hash_value): Ditto.
(pdump_put_block_hash): Ditto.
(pdump_get_block_hash): Ditto.
(initialize_block_hash): Ditto.
(pdump_float_blocks_size): Ditto.
(pdump_register_object): Undo the last change.
(pdump_forward_object): Ditto.
(pdump_write_objects): Ditto.
(pdump): Ditto.
(PDUMP_RELOCATE): Ditto.
(pdump_load): Ditto.
(pdump_relocate_objects): Ditto.
(unmark_pdumped_objects): Ditto.

* fontset.c (lookup_overriding_fontspec): Invalidate for Meadow.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/2.2/src/ChangeLog.Meadow

    r3675 r3676  
     12005-04-10  MIYOSHI Masanori  <miyoshi@meadowy.org> 
     2 
     3        * lisp.h (struct Lisp_Float): New member `gcmarkbit'.  This is a 
     4        hack for portable dumper. 
     5 
     6        * alloc.c (FLOAT_BLOCK_SIZE): Undo the last change. 
     7        (GETMARKBIT): Removed. 
     8        (SETMARKBIT): Ditto. 
     9        (UNSETMARKBIT): Ditto. 
     10        (FLOAT_BLOCK): Ditto. 
     11        (FLOAT_INDEX): Ditto. 
     12        (struct float_block): Undo the last change. 
     13        (FLOAT_MARKED_P): Refer to `gcmarkbit'.  This is a hack for 
     14        portable dumper. 
     15        (FLOAT_MARK): Ditto. 
     16        (FLOAT_UNMARK): Ditto. 
     17        (make_float): Initialize the allocated memory to clean up 
     18        `gcmarkbit'. 
     19        (PDUMP_BLOCK_HASH_SIZE): Removed. 
     20        (struct pdump_block): Removed. 
     21        (pdump_block_hash): Ditto. 
     22        (pdump_block_hash_value): Ditto. 
     23        (pdump_put_block_hash): Ditto. 
     24        (pdump_get_block_hash): Ditto. 
     25        (initialize_block_hash): Ditto. 
     26        (pdump_float_blocks_size): Ditto. 
     27        (pdump_register_object): Undo the last change. 
     28        (pdump_forward_object): Ditto. 
     29        (pdump_write_objects): Ditto. 
     30        (pdump): Ditto. 
     31        (PDUMP_RELOCATE): Ditto. 
     32        (pdump_load): Ditto. 
     33        (pdump_relocate_objects): Ditto. 
     34        (unmark_pdumped_objects): Ditto. 
     35 
     36        * fontset.c (lookup_overriding_fontspec): Invalidate for Meadow. 
     37 
    1382005-04-10  MIYOSHI Masanori  <miyoshi@meadowy.org> 
    239 
  • branches/2.2/src/alloc.c

    r3671 r3676  
    24732473   any new float cells from the latest float_block.  */ 
    24742474 
    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)) 
     2475#define FLOAT_BLOCK_SIZE \ 
     2476  ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float)) 
    24992477 
    25002478struct float_block 
     
    25022480  /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job.  */ 
    25032481  struct Lisp_Float floats[FLOAT_BLOCK_SIZE]; 
    2504   int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)]; 
    25052482  struct float_block *next; 
    25062483}; 
    25072484 
    25082485#define FLOAT_MARKED_P(fptr) \ 
    2509   GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))
     2486  ((fptr)->gcmarkbit
    25102487 
    25112488#define FLOAT_MARK(fptr) \ 
    2512   SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))
     2489  ((fptr)->gcmarkbit = 1
    25132490 
    25142491#define FLOAT_UNMARK(fptr) \ 
    2515   UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))
     2492  ((fptr)->gcmarkbit = 0
    25162493 
    25172494/* Current float_block.  */ 
     
    25782555          new = (struct float_block *) lisp_align_malloc (sizeof *new, 
    25792556                                                          MEM_TYPE_FLOAT); 
     2557          bzero ((char *) new, sizeof (*new)); 
    25802558          new->next = float_block; 
    2581           bzero ((char *) new->gcmarkbits, sizeof new->gcmarkbits); 
    25822559          float_block = new; 
    25832560          float_block_index = 0; 
     
    60976074#define PDUMP_HASH_TABLE_SIZE 7 /* for Lisp_Hash_Table */ 
    60986075#define PDUMP_OFFSET 12289 
    6099 #define PDUMP_BLOCK_HASH_SIZE 71 
    61006076 
    61016077static pdump_forward **pdump_hash; 
     
    63036279} 
    63046280 
    6305 /* Struct to hold a element of blocks in a hash table. */ 
    6306 typedef struct pdump_block 
    6307 { 
    6308   void *obj; 
    6309   int block_index; 
    6310   int element_index; 
    6311   struct pdump_block *next; 
    6312 } pdump_block; 
    6313  
    6314 static pdump_block **pdump_block_hash; 
    6315  
    6316 /* calculate hash value for Lisp_Object */ 
    6317 static int 
    6318 pdump_block_hash_value (void *obj) 
    6319 { 
    6320   return ((unsigned long) obj >> 3) % PDUMP_BLOCK_HASH_SIZE; 
    6321 } 
    6322  
    6323 /* put given Lisp_Object to pdump_block_hash */ 
    6324 static void 
    6325 pdump_put_block_hash (void *obj, int block_index, int element_index) 
    6326 { 
    6327   int idx = pdump_block_hash_value (obj); 
    6328   pdump_block **prev = &pdump_block_hash[idx]; 
    6329   pdump_block *f = pdump_block_hash[idx]; 
    6330  
    6331   while (f != 0) 
    6332     { 
    6333       if (f->obj == obj) 
    6334         return; 
    6335       prev = &(*prev)->next; 
    6336       f = f->next; 
    6337     } 
    6338   f = (pdump_block *) xmalloc (sizeof (*f)); 
    6339   f->obj = obj; 
    6340   f->block_index = block_index; 
    6341   f->element_index = element_index; 
    6342   f->next = NULL; 
    6343   *prev = f; 
    6344 } 
    6345  
    6346 /* retrieve pdump_forward entry of given Lisp_Object */ 
    6347 static pdump_block * 
    6348 pdump_get_block_hash (void *obj) 
    6349 { 
    6350   pdump_block *f = pdump_block_hash[pdump_block_hash_value (obj)]; 
    6351  
    6352   while (f != 0) 
    6353     { 
    6354       if (f->obj == obj) 
    6355         return f; 
    6356       f = f->next; 
    6357     } 
    6358   return 0; 
    6359 } 
    6360  
    6361 static void 
    6362 initialize_block_hash (void) 
    6363 { 
    6364   struct float_block *p = float_block; 
    6365   int n = float_block_index; 
    6366   int i, j = 0; 
    6367  
    6368   while (p) 
    6369     { 
    6370       for (i = 0; i < n; i++) 
    6371         { 
    6372           pdump_put_block_hash ((void *) &p->floats[i], j, i); 
    6373         } 
    6374       p = p->next; 
    6375       n = FLOAT_BLOCK_SIZE; 
    6376       j++; 
    6377     } 
    6378 } 
    6379  
    6380 static unsigned long 
    6381 pdump_float_blocks_size (void) 
    6382 { 
    6383   return sizeof (struct float_block) * n_float_blocks + sizeof (pdump_block); 
    6384 } 
    6385  
    63866281/* Register given object for pdump_hash and pdump_lisp_object[type] */ 
    63876282static void 
     
    63906285{ 
    63916286  assert (pdump_get_hash (obj) == 0); 
    6392  
    6393   switch (type) 
    6394     { 
    6395     case PDUMP_FLOAT: 
    6396       { 
    6397         pdump_block *pb = pdump_get_block_hash (XFLOAT (obj)); 
    6398         unsigned long offset; 
    6399  
    6400         offset = (pb->block_index * sizeof (struct float_block) 
    6401                   + pb->element_index * sizeof (struct Lisp_Float)); 
    6402         pdump_put_hash (obj, offset, size); 
    6403       } 
    6404       break; 
    6405  
    6406     default: 
    6407       pdump_put_hash (obj, pdump_lisp_object[type].size, size); 
    6408       pdump_lisp_object[type].size += size; 
    6409       pdump_lisp_object[type].objects[pdump_lisp_object[type].index++] = obj; 
    6410       if (pdump_lisp_object[type].index > pdump_lisp_object[type].objects_size) 
    6411         { 
    6412           pdump_lisp_object[type].objects_size *= 2; 
    6413           pdump_lisp_object[type].objects = 
    6414             xrealloc (pdump_lisp_object[type].objects,  
    6415                       sizeof (Lisp_Object) * pdump_lisp_object[type].objects_size); 
    6416         } 
    6417       break; 
     6287  pdump_put_hash (obj, pdump_lisp_object[type].size, size); 
     6288  pdump_lisp_object[type].size += size; 
     6289  pdump_lisp_object[type].objects[pdump_lisp_object[type].index++] = obj; 
     6290  if (pdump_lisp_object[type].index > pdump_lisp_object[type].objects_size) 
     6291    { 
     6292      pdump_lisp_object[type].objects_size *= 2; 
     6293      pdump_lisp_object[type].objects = 
     6294        xrealloc (pdump_lisp_object[type].objects,  
     6295                  sizeof (Lisp_Object) * pdump_lisp_object[type].objects_size); 
    64186296    } 
    64196297} 
     
    68056683 
    68066684  addr = f->offset + PDUMP_OFFSET + sizeof (pdump_header_type); 
    6807   switch (type) 
    6808     { 
    6809     case PDUMP_FLOAT: 
    6810       for (i = 0; i < PDUMP_OBJECT_LIMIT; i++) 
    6811         addr += pdump_lisp_object[i].size; 
    6812       break; 
    6813  
    6814     default: 
    6815       for (i = 0; i < type; i++) 
    6816         addr += pdump_lisp_object[i].size; 
    6817       break; 
    6818     } 
     6685  for (i = 0; i < type; i++) 
     6686    addr += pdump_lisp_object[i].size; 
    68196687  XSET (new_obj, XTYPE (obj), addr); 
    68206688  return new_obj; 
     
    69516819      fwrite (&new, size, 1, pdump_stream); 
    69526820    } 
     6821  for (i = 0; i < pdump_lisp_object[PDUMP_FLOAT].index; i++) 
     6822    { 
     6823      Lisp_Object obj = pdump_lisp_object[PDUMP_FLOAT].objects[i]; 
     6824      int size = sizeof (struct Lisp_Float); 
     6825      fwrite (XFLOAT (obj), size, 1, pdump_stream); 
     6826    } 
    69536827  for (i = 0; i < pdump_lisp_object[PDUMP_HASH_TABLE].index; i ++) 
    69546828    { 
     
    71126986  bzero (pdump_hash_table, sizeof (*pdump_hash_table) * PDUMP_HASH_TABLE_SIZE); 
    71136987 
    7114   pdump_block_hash = (pdump_block **) 
    7115     xmalloc (sizeof (*pdump_block_hash) * PDUMP_BLOCK_HASH_SIZE); 
    7116   bzero (pdump_block_hash, sizeof (*pdump_block_hash) * PDUMP_BLOCK_HASH_SIZE); 
    7117   initialize_block_hash (); 
    7118    
    71196988  pdump_stream = fopen ("emacs.dmp", "w"); 
    71206989 
     
    71677036                  header.hash_table_length, header.hash_table_size, 
    71687037                  header.vector_length, header.vector_size)); 
    7169  
    7170   /* write float blocks */ 
    7171   { 
    7172     struct float_block *p = float_block; 
    7173     unsigned long offset = PDUMP_OFFSET + sizeof (pdump_header_type); 
    7174     struct pdump_block_table bt; 
    7175      
    7176     for (i = 0; i < PDUMP_OBJECT_LIMIT; i++) 
    7177       offset += pdump_lisp_object[i].size; 
    7178  
    7179     bt.block = (struct float_block *) offset; 
    7180     bt.block_index = float_block_index; 
    7181     bt.n_blocks = n_float_blocks; 
    7182      
    7183     while (p) 
    7184       { 
    7185         struct float_block fb = *p; 
    7186  
    7187         if (fb.next) 
    7188           fb.next = (struct float_block *) (offset 
    7189                                             + sizeof (struct float_block)); 
    7190         fwrite (&fb, sizeof (fb), 1, pdump_stream); 
    7191         p = p->next; 
    7192         offset += sizeof (struct float_block); 
    7193       } 
    7194     fwrite (&bt, sizeof (bt), 1, pdump_stream); 
    7195   } 
    71967038 
    71977039  /* write misc */ 
     
    73007142  xfree (pdump_hash); 
    73017143 
    7302   for (i = 0; i < PDUMP_BLOCK_HASH_SIZE; i++) 
    7303     { 
    7304       pdump_block *f = pdump_block_hash[i], *next; 
    7305  
    7306       while (f != 0) 
    7307         { 
    7308           next = f->next; 
    7309           xfree (f); 
    7310           f = next; 
    7311         } 
    7312     } 
    7313   xfree (pdump_block_hash); 
    7314  
    73157144#ifdef PDUMP_DEBUG 
    73167145  assert (pure_bytes_used == 0); 
     
    73247153  if (! INTEGERP (obj)                                                  \ 
    73257154      && pdump_objects_start <= p_r_ptr                                 \ 
    7326       && (p_r_ptr < pdump_objects_start + pdump_header.objects_size     \ 
    7327           + pdump_float_blocks_size ()))                                \ 
     7155      && p_r_ptr < pdump_objects_start + pdump_header.objects_size)     \ 
    73287156    XSET ((obj), XTYPE (obj), p_r_ptr);                                 \ 
    73297157}                                                                       \ 
     
    75917419  PDUMP_MESSAGE (("Loading root objects... \n")); 
    75927420  lseek (fd, pdump_header.objects_size + sizeof (pdump_header_type), SEEK_SET); 
    7593  
    7594   /* load float blocks */ 
    7595   { 
    7596     struct float_block fb, *p; 
    7597     struct pdump_block_table bt; 
    7598     int count = 0; 
    7599  
    7600     do 
    7601       { 
    7602         read (fd, &fb, sizeof (fb)); 
    7603       } 
    7604     while (fb.next); 
    7605  
    7606     read (fd, &bt, sizeof (bt)); 
    7607     float_block = (struct float_block * )((unsigned long) bt.block 
    7608                                           + offset); 
    7609     float_block_index = bt.block_index; 
    7610     n_float_blocks = bt.n_blocks; 
    7611  
    7612     /* relocation */ 
    7613     p = float_block; 
    7614     while (p) 
    7615       { 
    7616         if (p->next) 
    7617           p->next = (struct float_block * ) ((unsigned long) p->next + offset); 
    7618         p = p->next; 
    7619       } 
    7620   } 
    7621  
    76227421  for (staticidx = 0; staticidx < pdump_header.root_objects_length; staticidx++) 
    76237422    { 
     
    78697668      obj_ptr += sizeof (struct Lisp_Symbol); 
    78707669    } 
     7670  for (i = 0; i < pdump_header.float_length; i++) 
     7671    obj_ptr += sizeof (struct Lisp_Float); 
    78717672  for (i = 0; i < pdump_header.hash_table_length; i ++) 
    78727673    obj_ptr += PDUMP_LISP_HASH_TABLE_SIZE; 
     
    79777778  assert (pdump_object_start_address (PDUMP_FLOAT) == obj_ptr); 
    79787779#endif 
    7979   { 
    7980     struct float_block *p = float_block; 
    7981     int n = float_block_index; 
    7982     int i; 
    7983  
    7984     while (p) 
    7985       { 
    7986         for (i = 0; i < n; i++) 
    7987           { 
    7988             if (FLOAT_MARKED_P (&p->floats[i])) 
    7989               FLOAT_UNMARK (&p->floats[i]); 
    7990           } 
    7991         p = p->next; 
    7992         n = FLOAT_BLOCK_SIZE; 
    7993       } 
    7994   } 
    7995  
     7780  for (i = 0; i < pdump_header.float_length; i++) 
     7781    { 
     7782      struct Lisp_Float *ptr = (struct Lisp_Float *)obj_ptr; 
     7783      if (FLOAT_MARKED_P (ptr)) 
     7784        FLOAT_UNMARK (ptr); 
     7785      obj_ptr += sizeof (struct Lisp_Float); 
     7786    } 
    79967787#ifdef PDUMP_DEBUG 
    79977788  assert (pdump_object_start_address (PDUMP_HASH_TABLE) == obj_ptr); 
  • branches/2.2/src/fontset.c

    r3674 r3676  
    253253 
    254254 
     255#ifndef MEADOW 
    255256static Lisp_Object 
    256257lookup_overriding_fontspec (frame, c) 
     
    292293  return Qnil; 
    293294} 
     295#endif /* not MEADOW */ 
    294296 
    295297#define FONTSET_REF_VIA_BASE(fontset, c) fontset_ref_via_base (fontset, &c) 
  • branches/2.2/src/lisp.h

    r3673 r3676  
    12711271struct Lisp_Float 
    12721272  { 
     1273#ifdef MEADOW 
     1274    /* Hack for portable dumper. This sholud be removed! */ 
     1275    unsigned gcmarkbit : 1; 
     1276    int spacer : 15; 
     1277#endif 
    12731278#ifdef HIDE_LISP_IMPLEMENTATION 
    12741279    double data_;