Changeset 3668

Show
Ignore:
Timestamp:
04/06/05 20:54:17 (4 years ago)
Author:
miyoshi
Message:

* alloc.c (FLOAT_BLOCK_SIZE): Sync up with Emacs CVS HEAD.
(FLOAT_BLOCK_SIZE): New macro.
(GETMARKBIT): Ditto.
(SETMARKBIT): Ditto.
(UNSETMARKBIT): Ditto.
(FLOAT_BLOCK): Ditto.
(FLOAT_INDEX): Ditto.
(struct float_block): Sync up with Emacs CVS HEAD.
(FLOAT_MARKED_P): Ditto.
(FLOAT_MARK): Ditto.
(FLOAT_UNMARK): Ditto.
(make_float): Ditto.
(mark_object): Ditto.
(pdump_block_table): New structure.
(PDUMP_BLOCK_HASH_SIZE): New macro.
(pdump_block): New structure.
(pdump_block_hash_value): New function.
(pdump_put_block_hash): Ditto.
(pdump_get_block_hash): Ditto.
(initialize_block_hash): Ditto.
(pdump_register_object): calculate a special offset for
PDUMP_FLOAT.
(pdump_write_objects): The codes related with PDUMP_FLOAT are
removed.
(pdump): Initialize `pdump_block_hash'.
(pdump): Wirte float blocks.
(pdump): Destruct memories for `pdump_block_hash'.
(PDUMP_RELOCATE): Consider space for `float_block'.
(pdump_load): Load float blocks.
(pdump_relocate_objects): The codes related with Lisp_Float are
removed.
(unmark_pdumped_objects): Sync up with Emacs CVS HEAD.

* lisp.h: Sync up with Emacs CVS HEAD. a member variable `type' is
removed.

Files:

Legend:

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

    r3667 r3668  
     12005-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 
    1392005-04-03  MIYOSHI Masanori  <miyoshi@meadowy.org> 
    240 
  • branches/2.2/src/alloc.c

    r3667 r3668  
    24732473   any new float cells from the latest float_block.  */ 
    24742474 
    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)) 
    24772499 
    24782500struct float_block 
     
    24802502  /* Place `floats' at the beginning, to ease up FLOAT_INDEX's job.  */ 
    24812503  struct Lisp_Float floats[FLOAT_BLOCK_SIZE]; 
     2504  int gcmarkbits[1 + FLOAT_BLOCK_SIZE / (sizeof(int) * CHAR_BIT)]; 
    24822505  struct float_block *next; 
    24832506}; 
    24842507 
    24852508#define FLOAT_MARKED_P(fptr) \ 
    2486   (XMARKBIT ((fptr)->type)) 
     2509  GETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) 
    24872510 
    24882511#define FLOAT_MARK(fptr) \ 
    2489   (XMARK ((fptr)->type)) 
     2512  SETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) 
    24902513 
    24912514#define FLOAT_UNMARK(fptr) \ 
    2492   (XUNMARK ((fptr)->type)) 
     2515  UNSETMARKBIT (FLOAT_BLOCK (fptr), FLOAT_INDEX ((fptr))) 
    24932516 
    24942517/* Current float_block.  */ 
     
    25562579                                                          MEM_TYPE_FLOAT); 
    25572580          new->next = float_block; 
     2581          bzero ((char *) new->gcmarkbits, sizeof new->gcmarkbits); 
    25582582          float_block = new; 
    25592583          float_block_index = 0; 
     
    50965120 
    50975121 loop: 
    5098   XUNMARK (obj); 
    50995122 
    51005123#ifndef PDUMP 
     
    51505173 
    51515174#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    } 
    51525193 
    51535194  switch (SWITCH_ENUM_CAST (XGCTYPE (obj))) 
     
    61176158} pdump_forward_hash_table; 
    61186159 
     6160 
     6161typedef struct pdump_block_table 
     6162{ 
     6163  void *block; 
     6164  int block_index; 
     6165  int n_blocks; 
     6166} pdump_block_table; 
     6167 
    61196168/* Struct to hold root object data. */ 
    61206169typedef struct pdump_root 
     
    61366185#define PDUMP_HASH_TABLE_SIZE 7 /* for Lisp_Hash_Table */ 
    61376186#define PDUMP_OFFSET 12289 
     6187#define PDUMP_BLOCK_HASH_SIZE 71 
    61386188 
    61396189static pdump_forward **pdump_hash; 
     
    63416391} 
    63426392 
     6393/* Struct to hold a element of blocks in a hash table. */ 
     6394typedef struct pdump_block 
     6395{ 
     6396  void *obj; 
     6397  int block_index; 
     6398  int element_index; 
     6399  struct pdump_block *next; 
     6400} pdump_block; 
     6401 
     6402static pdump_block **pdump_block_hash; 
     6403 
     6404/* calculate hash value for Lisp_Object */ 
     6405static int 
     6406pdump_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 */ 
     6412static void 
     6413pdump_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 */ 
     6435static pdump_block * 
     6436pdump_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 
     6449static void 
     6450initialize_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 
     6468static unsigned long 
     6469pdump_float_blocks_size (void) 
     6470{ 
     6471  return sizeof (struct float_block) * n_float_blocks + sizeof (pdump_block); 
     6472} 
     6473 
    63436474/* Register given object for pdump_hash and pdump_lisp_object[type] */ 
    63446475static void 
     
    63476478{ 
    63486479  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; 
    63586506    } 
    63596507} 
     
    67456893 
    67466894  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    } 
    67496907  XSET (new_obj, XTYPE (obj), addr); 
    67506908  return new_obj; 
     
    68817039      fwrite (&new, size, 1, pdump_stream); 
    68827040    } 
    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     } 
    68897041  for (i = 0; i < pdump_lisp_object[PDUMP_HASH_TABLE].index; i ++) 
    68907042    { 
     
    70487200  bzero (pdump_hash_table, sizeof (*pdump_hash_table) * PDUMP_HASH_TABLE_SIZE); 
    70497201 
     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   
    70507207  pdump_stream = fopen ("emacs.dmp", "w"); 
    70517208 
     
    70987255                  header.hash_table_length, header.hash_table_size, 
    70997256                  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  } 
    71007284 
    71017285  /* write misc */ 
     
    72047388  xfree (pdump_hash); 
    72057389 
     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 
    72067403#ifdef PDUMP_DEBUG 
    72077404  assert (pure_bytes_used == 0); 
     
    72157412  if (! INTEGERP (obj)                                                  \ 
    72167413      && 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 ()))                                \ 
    72187416    XSET ((obj), XTYPE (obj), p_r_ptr);                                 \ 
    72197417}                                                                       \ 
     
    74817679  PDUMP_MESSAGE (("Loading root objects... \n")); 
    74827680  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 
    74837710  for (staticidx = 0; staticidx < pdump_header.root_objects_length; staticidx++) 
    74847711    { 
     
    77307957      obj_ptr += sizeof (struct Lisp_Symbol); 
    77317958    } 
    7732   for (i = 0; i < pdump_header.float_length; i++) 
    7733     obj_ptr += sizeof (struct Lisp_Float); 
    77347959  for (i = 0; i < pdump_header.hash_table_length; i ++) 
    77357960    obj_ptr += PDUMP_LISP_HASH_TABLE_SIZE; 
     
    77647989    { 
    77657990      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); 
    77687993      obj_ptr += sizeof (struct Lisp_Cons); 
    77697994    } 
     
    78408065  assert (pdump_object_start_address (PDUMP_FLOAT) == obj_ptr); 
    78418066#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 
    78498084#ifdef PDUMP_DEBUG 
    78508085  assert (pdump_object_start_address (PDUMP_HASH_TABLE) == obj_ptr); 
  • branches/2.2/src/lisp.h

    r3667 r3668  
    12871287struct Lisp_Float 
    12881288  { 
    1289     Lisp_Object type;           /* essentially used for mark-bit 
    1290                                    and chaining when on free-list */ 
    12911289#ifdef HIDE_LISP_IMPLEMENTATION 
    12921290    double data_;