Newer
Older
libkc / modules / src / kc_memory_entry.c
  1. /**
  2. * @file kc_memory_entry.c
  3. * @brief KC メモリ管理 Entry サブモジュール
  4. * @copyright 2003 - 2023 Nomura Kei
  5. */
  6. #include <stdlib.h>
  7.  
  8. #include <kc_memory.h>
  9. #include <kc_memory_entry.h>
  10. #include "kc_memory_entry_inner.h"
  11.  
  12. #ifdef KC_MEMORY_ENABLED
  13. #undef KC_MEMORY_ENABLED
  14. #endif
  15.  
  16. #if !(KC_IS_WINDOWS)
  17. #define _aligned_free(ptr) raw_free(ptr)
  18. #endif
  19.  
  20. ////////////////////////////////////////////////////////////////////////////////
  21. //
  22. // 定数定義
  23. //
  24.  
  25. ////////////////////////////////////////////////////////////////////////////////
  26. //
  27. // 変数定義
  28. //
  29.  
  30. // For UNITTEST
  31. #ifdef UNITTEST
  32. bool (*_UT_KcMemory_can_alloc)(
  33. KcMemoryEntry *entry, size_t alignment, size_t size,
  34. KcMemoryMark mark, const char *file, const char *func, int line) = NULL;
  35. #endif // UNITTEST
  36.  
  37. /**
  38. * KcMemoryEntry を構築します。
  39. * entry が NULL の場合、新規に KeMemoryEntry を構築します。
  40. * entry が NULL でない場合、entry の管理するメモリサイズを変更し、各種値を更新します。
  41. * 構築に失敗した場合、NULL を返します。
  42. *
  43. * @param entry メモリエントリ
  44. * @param alignment アライメント
  45. * @param size メモリサイズ
  46. * @param mark メモリ状態
  47. * @param file メモリ確保ファイル名
  48. * @param func メモリ確保関数名
  49. * @param line メモリ確保行番号
  50. * @return 構築した KcMemoryEntry
  51. */
  52. KcMemoryEntry *KcMemoryEntry_new(KcMemoryEntry *entry, size_t alignment, size_t size,
  53. KcMemoryMark mark, const char *file, const char *func, int line)
  54. {
  55. #ifdef UNITTEST
  56. if (_UT_KcMemory_can_alloc &&
  57. !_UT_KcMemory_can_alloc(entry, alignment, size, mark, file, func, line))
  58. {
  59. return NULL;
  60. }
  61. #endif
  62. KcMemoryEntry *new_entry;
  63. if ((entry == NULL) && (alignment > 0) && (mark == KC_MEMORY_ALLOCATED_ALIGNED))
  64. { // アライメント指定でメモリを確保する。
  65. new_entry = (KcMemoryEntry *)raw_aligned_alloc(
  66. alignment, (size_t)(sizeof(KcMemoryEntry) + size));
  67. }
  68. else
  69. {
  70. new_entry = (KcMemoryEntry *)raw_realloc(
  71. entry, (size_t)(sizeof(KcMemoryEntry) + size));
  72. }
  73. KcMemoryEntry_set(new_entry, size, mark, file, func, line);
  74.  
  75. return new_entry;
  76. }
  77.  
  78. /**
  79. * KcMemoryEntry を破棄します。
  80. *
  81. * @param entry 破棄するメモリエントリ
  82. */
  83. void KcMemoryEntry_delete(KcMemoryEntry *entry)
  84. {
  85. if (entry->mark == KC_MEMORY_ALLOCATED_ALIGNED)
  86. {
  87. entry->mark = KC_MEMORY_DELETED;
  88. entry->size = 0;
  89. _aligned_free(entry);
  90. }
  91. else
  92. {
  93. entry->mark = KC_MEMORY_DELETED;
  94. entry->size = 0;
  95. raw_free(entry);
  96. }
  97. }
  98.  
  99. /**
  100. * 指定された entry に、指定された値を設定します。
  101. * entry が NULL の場合、何もしません。
  102. *
  103. * @param entry メモリエントリ
  104. * @param size メモリサイズ
  105. * @param mark メモリ状態
  106. * @param file メモリ確保ファイル名
  107. * @param func メモリ確保関数名
  108. * @param line メモリ確保行番号
  109. */
  110. void KcMemoryEntry_set(KcMemoryEntry *entry,
  111. size_t size, KcMemoryMark mark, const char *file, const char *func, int line)
  112. {
  113. if (entry != NULL)
  114. {
  115. entry->size = size;
  116. entry->mark = mark;
  117. entry->file = file;
  118. entry->func = func;
  119. entry->line = line;
  120. entry->_prev = NULL;
  121. entry->_next = NULL;
  122. entry->data = (entry + 1);
  123. }
  124. }