blockmem.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /// ********* WIN32 **********
  2. #ifdef SYSTEM_WIN32
  3. #define WIN32_LEAN_AND_MEAN
  4. #include <windows.h>
  5. #include <malloc.h>
  6. #include "cmdlib.h"
  7. #include "messages.h"
  8. #include "log.h"
  9. #include "hlassert.h"
  10. #include "blockmem.h"
  11. // =====================================================================================
  12. // AllocBlock
  13. // =====================================================================================
  14. void* AllocBlock(const unsigned long size)
  15. {
  16. void* pointer;
  17. HANDLE h;
  18. if (!size)
  19. {
  20. Warning("Attempting to allocate 0 bytes");
  21. }
  22. h = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, size);
  23. if (h)
  24. {
  25. pointer = GlobalLock(h);
  26. }
  27. else
  28. {
  29. return NULL;
  30. }
  31. return pointer;
  32. }
  33. // =====================================================================================
  34. // FreeBlock
  35. // =====================================================================================
  36. bool FreeBlock(void* pointer)
  37. {
  38. HANDLE h;
  39. if (!pointer)
  40. {
  41. Warning("Freeing a null pointer");
  42. }
  43. h = GlobalHandle(pointer);
  44. if (h)
  45. {
  46. GlobalUnlock(h);
  47. GlobalFree(h);
  48. return true;
  49. }
  50. else
  51. {
  52. Warning("Could not translate pointer into handle");
  53. return false;
  54. }
  55. }
  56. #ifdef CHECK_HEAP
  57. // =====================================================================================
  58. // HeapCheck
  59. // =====================================================================================
  60. void HeapCheck()
  61. {
  62. if (_heapchk() != _HEAPOK)
  63. hlassert(false);
  64. }
  65. #endif
  66. // =====================================================================================
  67. // AllocBlock
  68. // =====================================================================================
  69. // HeapAlloc/HeapFree is thread safe by default
  70. void* Alloc(const unsigned long size)
  71. {
  72. HeapCheck();
  73. return calloc(1, size);
  74. }
  75. // =====================================================================================
  76. // AllocBlock
  77. // =====================================================================================
  78. bool Free(void* pointer)
  79. {
  80. HeapCheck();
  81. free(pointer);
  82. return true;
  83. }
  84. #endif /// ********* WIN32 **********
  85. /// ********* POSIX **********
  86. #ifdef SYSTEM_POSIX
  87. #ifdef HAVE_CONFIG_H
  88. #include "config.h"
  89. #endif
  90. #ifdef STDC_HEADERS
  91. #include <stdlib.h>
  92. #endif
  93. #include "cmdlib.h"
  94. #include "messages.h"
  95. #include "log.h"
  96. // =====================================================================================
  97. // AllocBlock
  98. // =====================================================================================
  99. void* AllocBlock(const unsigned long size)
  100. {
  101. if (!size)
  102. {
  103. Warning("Attempting to allocate 0 bytes");
  104. }
  105. return calloc(1, size);
  106. }
  107. // =====================================================================================
  108. // FreeBlock
  109. // =====================================================================================
  110. bool FreeBlock(void* pointer)
  111. {
  112. if (!pointer)
  113. {
  114. Warning("Freeing a null pointer");
  115. }
  116. free(pointer);
  117. return true;
  118. }
  119. // =====================================================================================
  120. // Alloc
  121. // =====================================================================================
  122. void* Alloc(const unsigned long size)
  123. {
  124. return AllocBlock(size);
  125. }
  126. // =====================================================================================
  127. // Free
  128. // =====================================================================================
  129. bool Free(void* pointer)
  130. {
  131. return FreeBlock(pointer);
  132. }
  133. #endif /// ********* POSIX **********