免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: redor
打印 上一主题 下一主题

写了一段很丢人的代码,内存free不了,谁有BSD帮我测试一下. [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-10-09 14:53 |只看该作者
glibc库里面有自己维护内存的方式,不一定是你free它就交给os去了。
davelv 发表于 2010-10-09 11:41



    倒...... 重新用mmap搞了一下, 把新代码也贴出来. 可以通过命令测试 gcc -o vmm mmblock.c -D_DEBUG_MMBLOCK -DHAVE_MMAP -g && ./vmm
mmblock.h

  1. #ifndef _MMBLOCK_H_
  2. #define _MMBLOCK_H_
  3. typedef struct _MMBLOCK
  4. {
  5.            char *data;
  6.            int  ndata;
  7.           int  size;
  8.         int  left;
  9.         char *end;
  10. }MMBLOCK;
  11. #define  MMBLOCK_BASE             4096
  12. //#define  MMBLOCK_BASE         32768
  13. //#define  MMBLOCK_BASE         131072
  14. //#define  MMBLOCK_BASE         524288
  15. #define  MMBLOCK_MIN             1024
  16. #define  MMBLOCK_MAX             262144
  17. //#define  MMBLOCK_MAX             1048576
  18. /* initialize() */
  19. MMBLOCK *mmblock_init();
  20. /* recv() */
  21. int mmblock_recv(MMBLOCK *mmblock, int fd, int flag);
  22. /* read() */
  23. int mmblock_read(MMBLOCK *mmblock, int fd);
  24. /* SSL_read() */
  25. int mmblock_read_SSL(MMBLOCK *mmblock, void *ssl);
  26. /* push() */
  27. int mmblock_push(MMBLOCK *mmblock, char *data, int ndata);
  28. /* del() */
  29. int mmblock_del(MMBLOCK *mmblock, int ndata);
  30. /* reset() */
  31. void mmblock_reset(MMBLOCK *mmblock);
  32. /* clean() */
  33. void mmblock_clean(MMBLOCK *mmblock);
  34. #define MMB(x) ((MMBLOCK *)x)
  35. #define MMB_NDATA(x) ((MMBLOCK *)x)->ndata
  36. #define MMB_SIZE(x) ((MMBLOCK *)x)->size
  37. #define MMB_LEFT(x) ((MMBLOCK *)x)->left
  38. #define MMB_DATA(x) ((MMBLOCK *)x)->data
  39. #define MMB_END(x) ((MMBLOCK *)x)->end
  40. #define MMB_RECV(x, fd, flag) mmblock_recv(MMB(x), fd, flag)
  41. #define MMB_READ(x, fd) mmblock_read(MMB(x), fd)
  42. #define MMB_READ_SSL(x, ssl) mmblock_read_SSL(MMB(x), ssl)
  43. #define MMB_PUSH(x, data, ndata) mmblock_push(MMB(x), data, ndata)
  44. #define MMB_DELETE(x, ndata) mmblock_del(MMB(x), ndata)
  45. #define MMB_RESET(x) mmblock_reset(MMB(x))
  46. #define MMB_CLEAN(x) mmblock_clean(MMB(x))
  47. #endif
复制代码
mmblock.c

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <errno.h>
  5. #ifdef   HAVE_MMAP
  6. #include <sys/mman.h>
  7. #endif
  8. #ifdef  HAVE_SSL
  9. #include "xssl.h"
  10. #endif
  11. #include "mmblock.h"
  12. /* initialize() */
  13. MMBLOCK *mmblock_init()
  14. {
  15.         MMBLOCK *mmblock = NULL;
  16.         return mmblock = (MMBLOCK *)calloc(1, sizeof(MMBLOCK));
  17. }

  18. /* incre() */
  19. int mmblock_incre(MMBLOCK *mmblock, int incre_size)
  20. {
  21.         int size = 0, n = 0;
  22.     char *old = NULL;

  23.         if(mmblock && incre_size > 0)
  24.         {
  25.                 size = mmblock->ndata + incre_size;
  26.                 n = size / MMBLOCK_BASE;
  27.                 if(size % MMBLOCK_BASE) ++n;
  28.                 size = n * MMBLOCK_BASE;
  29.                 //fprintf(stdout, "%s::%d data:%p size:%d\n", __FILE__, __LINE__, mmblock->data, size);
  30. #ifdef         HAVE_MMAP
  31.                 if((old = mmblock->data))
  32.                 {
  33.                         if((mmblock->data = (char *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE,-1,0)) == (void *)-1)
  34.                 mmblock->data = NULL;
  35.             if(mmblock->data && mmblock->ndata > 0) memcpy(mmblock->data, old, mmblock->ndata);
  36.             munmap(old, mmblock->size);
  37.                 }
  38.                 else
  39.                 {
  40.                         if((mmblock->data = (char *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE,-1,0)) == (void *)-1)
  41.             {
  42.                 mmblock->data = NULL;
  43.             }
  44.                 }
  45. #else

  46.                 mmblock->data = (char *)realloc(mmblock->data, size);
  47. #endif
  48.                 if(mmblock->data)
  49.                 {
  50.                         mmblock->end = mmblock->data + mmblock->ndata;
  51.                         mmblock->left = size - mmblock->ndata;
  52.                         mmblock->size = size;
  53.                         return 0;
  54.                 }
  55.                 else
  56.                 {
  57.                         mmblock->end = mmblock->data = NULL;
  58.                         mmblock->left = mmblock->ndata = mmblock->size = 0;
  59.                 }
  60.                        
  61.         }
  62.         return -1;
  63. }

  64. /* check() */
  65. int mmblock_check(MMBLOCK *mmblock)
  66. {
  67.         if(mmblock && mmblock->left < MMBLOCK_MIN)
  68.         {
  69.                 return mmblock_incre(mmblock, MMBLOCK_BASE);               
  70.         }
  71.         return -1;
  72. }

  73. /* recv() */
  74. int mmblock_recv(MMBLOCK *mmblock, int fd, int flag)
  75. {
  76.         int n = -1;

  77.         if(mmblock && fd > 0)
  78.         {
  79.                 mmblock_check(mmblock);
  80.                 if(mmblock->data && mmblock->end && mmblock->left > 0
  81.                 && (n = recv(fd, mmblock->end, mmblock->left, flag)) > 0)
  82.                 {
  83.                         mmblock->end += n;
  84.                         mmblock->ndata += n;
  85.                         mmblock->left -= n;               
  86.                 }       
  87.         }
  88.         return n;
  89. }

  90. /* read() */
  91. int mmblock_read(MMBLOCK *mmblock, int fd)
  92. {
  93.         int n = -1;

  94.         if(mmblock && fd > 0)
  95.         {
  96.                 mmblock_check(mmblock);
  97.                 if(mmblock->data && mmblock->end && mmblock->left > 0
  98.                 && (n = read(fd, mmblock->end, mmblock->left)) > 0)
  99.                 {
  100.                         mmblock->ndata += n;
  101.                         mmblock->end += n;
  102.                         mmblock->left -= n;
  103.                 }
  104.         }
  105.         return n;
  106. }

  107. /* SSL_read() */
  108. int mmblock_read_SSL(MMBLOCK *mmblock, void *ssl)
  109. {
  110.         int n = -1;
  111.         if(mmblock && ssl)
  112.         {
  113.                 mmblock_check(mmblock);
  114. #ifdef HAVE_SSL
  115.                 if(mmblock->data && mmblock->end && mmblock->left > 0
  116.                 && (n = SSL_read(XSSL(ssl), mmblock->end, mmblock->left)) > 0)
  117.                 {
  118.                         mmblock->ndata += n;
  119.                         mmblock->end += n;
  120.                         mmblock->left -= n;
  121.                 }
  122. #endif
  123.         }
  124.         return n;
  125. }

  126. /* push() */
  127. int mmblock_push(MMBLOCK *mmblock, char *data, int ndata)
  128. {
  129.         if(mmblock && data && ndata > 0)
  130.         {
  131.                 if(mmblock->left < ndata) mmblock_incre(mmblock, ndata);
  132.                 if(mmblock->left > ndata && mmblock->data && mmblock->end)
  133.                 {
  134.                         memcpy(mmblock->end, data, ndata);
  135.                         mmblock->ndata += ndata;
  136.                         mmblock->end += ndata;
  137.                         mmblock->left -= ndata;
  138.                         return ndata;
  139.                 }
  140.         }
  141.         return -1;
  142. }

  143. /* del() */
  144. int mmblock_del(MMBLOCK *mmblock, int ndata)
  145. {
  146.         char *s = NULL, *p = NULL;

  147.         if(mmblock && ndata > 0)
  148.         {
  149.                 if(mmblock->ndata <= ndata)
  150.                 {
  151.                         mmblock->end = mmblock->data;
  152.                         mmblock->left = mmblock->size;
  153.                         mmblock->ndata = 0;
  154.                 }
  155.                 else
  156.                 {
  157.                         p = mmblock->data;                       
  158.                         s = mmblock->data + ndata;
  159.                         while(s < mmblock->end) *p++ = *s++;
  160.                         mmblock->end = p;
  161.                         mmblock->left += ndata;
  162.                         mmblock->ndata -= ndata;
  163.                 }
  164.                 return 0;
  165.         }
  166.         return -1;
  167. }

  168. /* reset() */
  169. void mmblock_reset(MMBLOCK *mmblock)
  170. {
  171.         if(mmblock)
  172.         {
  173.                 if(mmblock->size > MMBLOCK_MAX)
  174.                 {
  175.                         if(mmblock->data)
  176.             {

  177. #ifdef HAVE_MMAP
  178.                 munmap(mmblock->data, mmblock->size);
  179. #else
  180.                 free(mmblock->data);
  181. #endif
  182.             }
  183.                         mmblock->size = mmblock->ndata = mmblock->left = 0;
  184.                         mmblock->end = mmblock->data  = NULL;
  185.                 }
  186.                 else
  187.                 {
  188.                         mmblock->end = mmblock->data;
  189.                         mmblock->left = mmblock->size;
  190.                         mmblock->ndata = 0;
  191.                 }
  192.         }
  193.         return ;
  194. }

  195. /* clean() */
  196. void mmblock_clean(MMBLOCK *mmblock)
  197. {
  198.         if(mmblock)
  199.         {
  200.                 if(mmblock->data)
  201.         {
  202. #ifdef HAVE_MMAP
  203.             munmap(mmblock->data, mmblock->size);
  204. #else
  205.             free(mmblock->data);
  206. #endif
  207.         }
  208.                 free(mmblock);
  209.         }
  210.         return ;
  211. }


  212. #ifdef _DEBUG_MMBLOCK
  213. #include <fcntl.h>
  214. int main()
  215. {
  216.         char *s = "DSKALFJLSDJFLKASJFKLDAJFKLAKLkljklajfldkfmnklasnfkladsnk";
  217.         MMBLOCK *mmblocks[40960];
  218.         int i = 0, fd = -1, n = strlen(s);
  219.     if((fd = open("/tmp/testfile", O_RDONLY)) > 0)
  220.     {
  221.         //initialize
  222.         for(i = 0; i < 40960; i++)
  223.         {
  224.             if((mmblocks[i] = mmblock_init()))
  225.             {
  226.                 mmblock_push(mmblocks[i], s, n);
  227.                 lseek(fd, 0, SEEK_SET);
  228.                 mmblock_read(mmblocks[i], fd);
  229.             }
  230.             //fprintf(stdout, "last_mmblock[%p]->ndata:%d\n", mmblocks[i], mmblocks[i]->ndata);
  231.         }
  232.         //while(1)sleep(1);
  233.         //clean
  234.         for(i = 0; i < 40960; i++)
  235.         {
  236.             if(mmblocks[i]) mmblock_clean(mmblocks[i]);
  237.         }
  238.         close(fd);
  239.     }
  240.         while(1)sleep(1);
  241.         return 0;
  242. }
  243. //gcc -o vmm mmblock.c -D_DEBUG_MMBLOCK -DHAVE_MMAP -g && ./vmm
  244. #endif
复制代码

论坛徽章:
0
12 [报告]
发表于 2010-10-09 14:54 |只看该作者
回复 9# cugb_cat

hehe 我重新通过mmap实现了一下. 太搞了 之前没碰到过这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP