home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / fj / os / 386bsd / 244 < prev    next >
Encoding:
Internet Message Format  |  1993-01-08  |  7.1 KB

  1. Path: sparky!uunet!ccut!news.u-tokyo.ac.jp!yayoi!tansei1!mhiroshi
  2. From: mhiroshi@tansei.cc.u-tokyo.ac.jp (H. Murakami)
  3. Newsgroups: fj.os.386bsd
  4. Subject: patch for kvm.c   and top3.0.
  5. Message-ID: <3848@tansei1.tansei.cc.u-tokyo.ac.jp>
  6. Date: 8 Jan 93 13:43:22 GMT
  7. Sender: news@tansei.cc.u-tokyo.ac.jp
  8. Distribution: fj
  9. Organization: Hokkaido Univ. However I am subject to tansei for JUNET.
  10. Lines: 272
  11.  
  12. To: fj.os.386bsd
  13. Subject: patch for kvm.c   and top3.0.
  14.  
  15. Memory leak $B$rD>$9%Q%C%A$H(J, top3.0 $B$N%Q%C%A(J.
  16.  
  17. ========> QUOTE <===========================
  18. Article: 10578 of comp.unix.bsd
  19. From: mycroft@hal.gnu.ai.mit.edu (Charles Hannum)
  20. Newsgroups: comp.unix.bsd
  21. Subject: Memory leak in kvm_getprocs() and top 3.0
  22. Message-ID: <1ig4u5INNstu@life.ai.mit.edu>
  23. Date: 7 Jan 93 02:35:49 GMT
  24. Organization: MIT Artificial Intelligence Lab
  25. Lines: 253
  26. NNTP-Posting-Host: hal.gnu.ai.mit.edu
  27. Status: R
  28.  
  29.  
  30. Here are two sets of patches.  The first fixes a memory leak in
  31. kvm_getprocs(), and the second is to convent m_bsd44.c to m_386bsd.c,
  32. in the top 3.0 distribution.
  33.  
  34. Note that while I've tried to take advantage of virtual memory
  35. metering, this is not yet implemented in 386BSD.  I'm also not entirely
  36. certain why the resident size always shows up as `0'.  I'll post a
  37. patch when I decide to think about it again.
  38.  
  39. -----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----
  40. *** /usr/src/lib/libutil/kvm.c~    Fri Nov 27 21:16:35 1992
  41. --- /usr/src/lib/libutil/kvm.c    Wed Jan  6 20:32:34 1993
  42. ***************
  43. *** 99,105 ****
  44.   /*
  45.    * state
  46.    */
  47. ! static    struct kinfo_proc *kvmprocbase, *kvmprocptr;
  48.   static    int kvmnprocs;
  49.   /*
  50.    * u. buffer
  51. --- 99,105 ----
  52.   /*
  53.    * state
  54.    */
  55. ! static    struct kinfo_proc *kvmprocbase = NULL, *kvmprocptr;
  56.   static    int kvmnprocs;
  57.   /*
  58.    * u. buffer
  59. ***************
  60. *** 406,411 ****
  61. --- 406,413 ----
  62.               return (-1);
  63.           }
  64.           copysize = ret;
  65. +         if (kvmprocbase)
  66. +             free(kvmprocbase);
  67.           if ((kvmprocbase = (struct kinfo_proc *)malloc(copysize)) 
  68.                == NULL) {
  69.               seterr("out of memory");
  70. -----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----
  71.  
  72. -----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----
  73. *** m_bsd44.c    Sat May  9 15:09:54 1992
  74. --- m_386bsd.c    Wed Jan  6 21:28:02 1993
  75. ***************
  76. *** 2,17 ****
  77.    * top - a top users display for Unix
  78.    *
  79. !  * SYNOPSIS:  For a pre-release 4.4BSD system
  80. !  *          Note memory statistisc and process sizes could be wrong,
  81. !  *          by ps gets them wrong too...
  82.    *
  83.    * DESCRIPTION:
  84. !  * This is the machine-dependent module for BSD4.4 
  85. !  * Works for:
  86. !  *    hp300
  87.    *
  88. !  * LIBS: -lkvm
  89. !  *
  90. !  * AUTHOR:  Christos Zoulas <christos@ee.cornell.edu>
  91.    */
  92.   
  93. --- 2,13 ----
  94.    * top - a top users display for Unix
  95.    *
  96. !  * SYNOPSIS:  For 386BSD 0.1
  97.    *
  98.    * DESCRIPTION:
  99. !  * This is the machine-dependent module for 386BSD
  100.    *
  101. !  * AUTHOR:  Charles Hannum <mycroft@ai.mit.edu>
  102. !  *        based on m_bsd44.c, by
  103. !  *        Christos Zoulas <christos@ee.cornell.edu>
  104.    */
  105.   
  106. ***************
  107. *** 27,30 ****
  108. --- 23,27 ----
  109.   #include <sys/kinfo.h>
  110.   #include <sys/kinfo_proc.h>
  111. + #include <sys/vmmeter.h>
  112.   #ifdef notyet
  113.   #define time __time
  114. ***************
  115. *** 45,50 ****
  116.   #include "machine.h"
  117.   
  118. ! #define VMUNIX    "/vmunix"
  119. ! #define KMEM    "/dev/kmem"
  120.   #define MEM    "/dev/mem"
  121.   #ifdef DOSWAP
  122. --- 42,47 ----
  123.   #include "machine.h"
  124.   
  125. ! #define VMUNIX    "/386bsd"
  126. ! #define KMEM    NULL
  127.   #define MEM    "/dev/mem"
  128.   #ifdef DOSWAP
  129. ***************
  130. *** 79,82 ****
  131. --- 76,80 ----
  132.   #define X_HZ        2
  133.   #define X_AVENRUN    3
  134. + #define X_TOTAL        4
  135.   
  136.   static struct nlist nlst[] = {
  137. ***************
  138. *** 85,88 ****
  139. --- 83,87 ----
  140.       { "_hz" },            /* 2 */
  141.       { "_averunnable" },        /* 3 */
  142. +     { "_total" },        /* 4 */
  143.       { 0 }
  144.   };
  145. ***************
  146. *** 111,116 ****
  147.   
  148.   
  149. - static kvm_t *kd;
  150.   /* values that we stash away in _init and use in later routines */
  151.   
  152. --- 110,113 ----
  153. ***************
  154. *** 185,194 ****
  155.       register int pagesize;
  156.   
  157. !     if ((kd = kvm_open(VMUNIX, MEM, SWAP, O_RDONLY, "kvm_open")) == NULL)
  158.       return -1;
  159.   
  160.       /* get the list of symbols we want to access in the kernel */
  161. !     (void) kvm_nlist(kd, nlst);
  162.       if (nlst[0].n_type == 0)
  163.       {
  164. --- 182,190 ----
  165.       register int pagesize;
  166.   
  167. !     if (kvm_openfiles(VMUNIX, KMEM, SWAP) == -1)
  168.       return -1;
  169.   
  170.       /* get the list of symbols we want to access in the kernel */
  171. !     (void) kvm_nlist(nlst);
  172.       if (nlst[0].n_type == 0)
  173.       {
  174. ***************
  175. *** 302,307 ****
  176.       int size;
  177.   
  178. !     /* get total -- systemwide main memory usage structure */
  179. !     getkerninfo(KINFO_METER, &total, &size, 0);
  180.       /* convert memory stats to Kbytes */
  181.       memory_stats[0] = -1;
  182. --- 298,303 ----
  183.       int size;
  184.   
  185. !         (void) getkval(nlst[X_TOTAL].n_value, (int *)(&total), sizeof(total),
  186. !                nlst[X_TOTAL].n_name);
  187.       /* convert memory stats to Kbytes */
  188.       memory_stats[0] = -1;
  189. ***************
  190. *** 343,354 ****
  191.   
  192.       
  193. !     pbase = kvm_getprocs(kd, KINFO_PROC_ALL, 0, &nproc);
  194. !     if (nproc > onproc)
  195. !     pref = (struct kinfo_proc **) realloc(pref, sizeof(struct kinfo_proc *)
  196. !         * (onproc = nproc));
  197. !     if (pref == NULL || pbase == NULL) {
  198. !     (void) fprintf(stderr, "top: Out of memory.\n");
  199.       quit(23);
  200.       }
  201.       /* get a pointer to the states summary array */
  202.       si->procstates = process_states;
  203. --- 339,355 ----
  204.   
  205.       
  206. !     if ((nproc = kvm_getprocs(KINFO_PROC_ALL, 0)) == -1) {
  207. !         (void) fprintf(stderr, "top: kvm_getprocs() failed: %s\n", kvm_geterr());
  208. !     quit(23);
  209. !     }
  210. !     if (pref)
  211. !         free(pref);
  212. !     if ((pref = (struct kinfo_proc **) malloc(sizeof(struct kinfo_proc *) * nproc)) ==  NULL) {
  213. !         (void) fprintf(stderr, "top: out of memory\n");
  214.       quit(23);
  215.       }
  216.       /* get a pointer to the states summary array */
  217.       si->procstates = process_states;
  218. ***************
  219. *** 365,369 ****
  220.       memset((char *)process_states, 0, sizeof(process_states));
  221.       prefp = pref;
  222. !     for (pp = pbase, i = 0; i < nproc; pp++, i++)
  223.       {
  224.       /*
  225. --- 366,370 ----
  226.       memset((char *)process_states, 0, sizeof(process_states));
  227.       prefp = pref;
  228. !     for (kvm_setproc(); pp = (struct kinfo_proc *) kvm_nextproc();)
  229.       {
  230.       /*
  231. ***************
  232. *** 520,524 ****
  233.   
  234.   {
  235. !     if (kvm_read(kd, offset, (char *) ptr, size) != size)
  236.       {
  237.       if (*refstr == '!')
  238. --- 521,525 ----
  239.   
  240.   {
  241. !     if (kvm_read((void *) offset, (char *) ptr, size) != size)
  242.       {
  243.       if (*refstr == '!')
  244. ***************
  245. *** 562,575 ****
  246.   proc_compare(pp1, pp2)
  247.   
  248. ! struct kinfo_proc **pp1;
  249. ! struct kinfo_proc **pp2;
  250.   
  251.   {
  252. !     register struct kinfo_proc *p1;
  253. !     register struct kinfo_proc *p2;
  254.       register int result;
  255.       register pctcpu lresult;
  256.   
  257. -     /* remove one level of indirection */
  258.       p1 = *pp1;
  259.       p2 = *pp2;
  260. --- 563,573 ----
  261.   proc_compare(pp1, pp2)
  262.   
  263. ! struct kinfo_proc **pp1, **pp2;
  264.   
  265.   {
  266. !     register struct kinfo_proc *p1, *p2;
  267.       register int result;
  268.       register pctcpu lresult;
  269.   
  270.       p1 = *pp1;
  271.       p2 = *pp2;
  272. -----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----
  273. -- 
  274.  \  /   Charles Hannum, mycroft@ai.mit.edu
  275.  /\ \   PGP public key available on request.  MIME, AMS, NextMail accepted.
  276. Scheme  White heterosexual atheist male (WHAM) pride!
  277.  
  278.  
  279.