Changeset 8245


Ignore:
Timestamp:
Jan 23, 2008, 6:15:44 AM (12 years ago)
Author:
gb
Message:

Collect paging stats in GC.

Location:
trunk/source/lisp-kernel
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/gc-common.c

    r8202 r8245  
    2626#include <sys/time.h>
    2727
     28#ifndef timeradd
     29# define timeradd(a, b, result)                                               \
     30  do {                                                                        \
     31    (result)->tv_sec = (a)->tv_sec + (b)->tv_sec;                             \
     32    (result)->tv_usec = (a)->tv_usec + (b)->tv_usec;                          \
     33    if ((result)->tv_usec >= 1000000)                                         \
     34      {                                                                       \
     35        ++(result)->tv_sec;                                                   \
     36        (result)->tv_usec -= 1000000;                                         \
     37      }                                                                       \
     38  } while (0)
     39#endif
     40#ifndef timersub
     41# define timersub(a, b, result)                                               \
     42  do {                                                                        \
     43    (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;                             \
     44    (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;                          \
     45    if ((result)->tv_usec < 0) {                                              \
     46      --(result)->tv_sec;                                                     \
     47      (result)->tv_usec += 1000000;                                           \
     48    }                                                                         \
     49  } while (0)
     50#endif
     51
     52void
     53comma_output_decimal(char *buf, int len, natural n)
     54{
     55  int nout = 0;
     56
     57  buf[--len] = 0;
     58  do {
     59    buf[--len] = n%10+'0';
     60    n = n/10;
     61    if (n == 0) {
     62      while (len) {
     63        buf[--len] = ' ';
     64      }
     65      return;
     66    }
     67    if (len == 0) return;
     68    nout ++;
     69    if (nout == 3) {
     70      buf[--len] = ',';
     71      nout = 0;
     72    }
     73  } while (len >= 0);
     74}
    2875
    2976
     
    794841  area *a = active_dynamic_area, *to = NULL, *from = NULL, *note = NULL;
    795842  unsigned timeidx = 1;
     843  paging_info paging_info_start;
    796844  xframe_list *x;
    797845  LispObj
     
    846894
    847895  if (GCverbose) {
     896    char buf[16];
     897
     898    sample_paging_info(&paging_info_start);
     899    comma_output_decimal(buf,16,area_dnode(oldfree,a->low) << dnode_shift);
    848900    if (GCephemeral_low) {
    849901      fprintf(stderr,
     
    853905      fprintf(stderr,"\n\n;;; Starting full GC");
    854906    }
    855     fprintf(stderr, ",  %ld bytes allocated.\n", area_dnode(oldfree,a->low) << dnode_shift);
     907    fprintf(stderr, ", %s bytes allocated.\n", buf);
    856908  }
    857909
     
    11481200      *( (long long *) ptr_from_lispobj(((macptr *) ptr_from_lispobj(untag(val)))->address)) += justfreed;
    11491201      if (GCverbose) {
     1202        char buf[16];
     1203        paging_info paging_info_stop;
     1204
     1205        sample_paging_info(&paging_info_stop);
    11501206        if (justfreed <= heap_segment_size) {
    11511207          justfreed = 0;
    11521208        }
     1209        comma_output_decimal(buf,16,justfreed);
    11531210        if (note == tenured_area) {
    1154           fprintf(stderr,";;; Finished full GC.  Freed %lld bytes in %d.%06d s\n\n", justfreed, elapsed.tv_sec, elapsed.tv_usec);
     1211          fprintf(stderr,";;; Finished full GC. %s bytes freed in %d.%06d s\n\n", buf, elapsed.tv_sec, elapsed.tv_usec);
    11551212        } else {
    1156           fprintf(stderr,";;; Finished Ephemeral GC of generation %d.  Freed %lld bytes in %d.%06d s\n\n",
     1213          fprintf(stderr,";;; Finished EGC of generation %d. %s bytes freed in %d.%06d s\n\n",
    11571214                  (from == g2_area) ? 2 : (from == g1_area) ? 1 : 0,
    1158                   justfreed,
     1215                  buf,
    11591216                  elapsed.tv_sec, elapsed.tv_usec);
    11601217        }
    1161       }
    1162     }
    1163   }
    1164 }
     1218        report_paging_info_delta(stderr, &paging_info_start, &paging_info_stop);
     1219      }
     1220    }
     1221  }
     1222}
  • trunk/source/lisp-kernel/gc.h

    r7644 r8245  
    111111#define VOID_ALLOCPTR ((LispObj)(-dnode_size))
    112112#endif
     113
     114#ifdef DARWIN
     115#include <mach/task_info.h>
     116typedef struct task_events_info paging_info;
     117#else
     118#ifndef WINDOWS
     119#include <sys/resource.h>
     120typedef struct rusage paging_info;
     121#endif
     122#endif
     123
     124#include <stdio.h>
     125
     126void sample_paging_info(paging_info *);
     127void report_paging_info_delta(FILE*, paging_info *, paging_info *);
    113128
    114129
  • trunk/source/lisp-kernel/pmcl-kernel.c

    r7668 r8245  
    18801880
    18811881
     1882#ifdef DARWIN
     1883void
     1884sample_paging_info(paging_info *stats)
     1885{
     1886  mach_msg_type_number_t count = TASK_EVENTS_INFO_COUNT;
     1887
     1888  task_info(mach_task_self(),
     1889            TASK_EVENTS_INFO,
     1890            (task_info_t)stats,
     1891            &count);
     1892}
     1893
     1894void
     1895report_paging_info_delta(FILE *out, paging_info *start, paging_info *stop)
     1896{
     1897  fprintf(out,";;; %d soft faults, %d faults, %d pageins\n\n",
     1898          stop->cow_faults-start->cow_faults,
     1899          stop->faults-start->faults,
     1900          stop->pageins-start->pageins);
     1901}
     1902
     1903#else
     1904#ifndef WINDOWS
     1905void
     1906sample_paging_info(struct rusage *usage)
     1907{
     1908  getrusage(RUSAGE_SELF, rusage);
     1909}
     1910
     1911void
     1912report_paging_info_delta(FILE *out, paging_info *start, paging_info *stop)
     1913{
     1914  fprintf(out,";;; %d soft faults, %d faults, %d pageins\n\n",
     1915          stop->ru_minflt-start->ru_minflt,
     1916          stop->ru_majflt-start->ru_majflt,
     1917          stop->ru_nswap-start->ru_nswap);
     1918}
     1919
     1920#endif
     1921#endif
Note: See TracChangeset for help on using the changeset viewer.