valloc.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <pthread.h>
  5. #include <unistd.h>
  6. static pthread_mutex_t mutex;
  7. static int count = 0;
  8. static int use = 0;
  9. void *v_malloc(size_t size)
  10. {
  11. void *p;
  12. p = malloc(size ? size + sizeof(int) : 0);
  13. if (!p)
  14. return NULL;
  15. pthread_mutex_lock(&mutex); // 互斥锁上锁
  16. count++;
  17. *(int *)p = size;
  18. use += size;
  19. pthread_mutex_unlock(&mutex); // 互斥锁解锁
  20. return (void *)((char *)p + sizeof(int));
  21. }
  22. void *v_calloc(size_t num, size_t size)
  23. {
  24. void *p;
  25. p = v_malloc(num * size);
  26. if (!p)
  27. return NULL;
  28. memset(p, 0, num * size);
  29. return p;
  30. }
  31. void v_free(void *block)
  32. {
  33. void *p;
  34. if (!block)
  35. return;
  36. p = (void *)((char *)block - sizeof(int));
  37. pthread_mutex_lock(&mutex); // 互斥锁上锁
  38. use -= *(int *)p;
  39. count--;
  40. pthread_mutex_unlock(&mutex); // 互斥锁解锁
  41. free(p);
  42. }
  43. void *v_realloc(void *block, size_t size)
  44. {
  45. void *p;
  46. int s = 0;
  47. if (block)
  48. {
  49. block = (void *)((char *)block - sizeof(int));
  50. s = *(int *)block;
  51. }
  52. p = realloc(block, size ? size + sizeof(int) : 0);
  53. if (!p)
  54. return NULL;
  55. pthread_mutex_lock(&mutex); // 互斥锁上锁
  56. if (!block)
  57. count++;
  58. *(int *)p = size;
  59. use += (size - s);
  60. pthread_mutex_unlock(&mutex); // 互斥锁解锁
  61. return (void *)((char *)p + sizeof(int));
  62. }
  63. int v_mcheck(int *_count, int *_use)
  64. {
  65. pthread_mutex_lock(&mutex); // 互斥锁上锁
  66. if (_count)
  67. *_count = count;
  68. if (_use)
  69. *_use = use;
  70. pthread_mutex_unlock(&mutex); // 互斥锁解锁
  71. return 0;
  72. }
  73. void displayMem()
  74. {
  75. int area = 0, use = 0;
  76. v_mcheck(&area, &use);
  77. printf("|||----------->>> area = %d, size = %d\r\n", area, use);
  78. }
  79. void vallocInit()
  80. {
  81. /* 初始化互斥锁 */
  82. pthread_mutex_init(&mutex, NULL);
  83. }