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_entry.h>
  9. #include "kc_memory_entry_inner.h"
  10.  
  11. ////////////////////////////////////////////////////////////////////////////////
  12. //
  13. // 定数定義
  14. //
  15.  
  16. /** パディング */
  17. #define KC_MEMORY_PADDING (sizeof(void *) * 2)
  18.  
  19. /**
  20. * KcMemoryEntry を構築します。
  21. * entry が NULL の場合、新規に KeMemoryEntry を構築します。
  22. * entry が NULL でない場合、entry の管理するメモリサイズを変更し、各種値を更新します。
  23. * 構築に失敗した場合、NULL を返します。
  24. *
  25. * @param entry メモリエントリ
  26. * @param alignment アライメント
  27. * @param size メモリサイズ
  28. * @param mark メモリ状態
  29. * @param file メモリ確保ファイル名
  30. * @param func メモリ確保関数名
  31. * @param line メモリ確保行番号
  32. * @return 構築した KcMemoryEntry
  33. */
  34. KcMemoryEntry *KcMemoryEntry_new(KcMemoryEntry *entry, size_t alignment, size_t size,
  35. KcMemoryMark mark, const char *file, const char *func, int line)
  36. {
  37. KcMemoryEntry *new_entry;
  38. if ((entry == NULL) && (alignment > 0))
  39. { // アライメント指定でメモリを確保する。
  40. new_entry = (KcMemoryEntry *)aligned_alloc(alignment,
  41. (size_t)(size + sizeof(KcMemoryEntry) + KC_MEMORY_PADDING));
  42. }
  43. else
  44. {
  45. new_entry = (KcMemoryEntry *)realloc(entry,
  46. (size_t)(size + sizeof(KcMemoryEntry) + KC_MEMORY_PADDING));
  47. }
  48.  
  49. KcMemoryEntry_set(new_entry, size, mark, file, func, line);
  50. return new_entry;
  51. }
  52.  
  53. /**
  54. * KcMemoryEntry を破棄します。
  55. *
  56. * @param entry 破棄するメモリエントリ
  57. */
  58. void KcMemoryEntry_delete(KcMemoryEntry *entry)
  59. {
  60. entry->mark = KC_MEMORY_DELETED;
  61. entry->size = 0;
  62. free(entry);
  63. }
  64.  
  65. /**
  66. * 指定された entry に、指定された値を設定します。
  67. * entry が NULL の場合、何もしません。
  68. *
  69. * @param entry メモリエントリ
  70. * @param size メモリサイズ
  71. * @param mark メモリ状態
  72. * @param file メモリ確保ファイル名
  73. * @param func メモリ確保関数名
  74. * @param line メモリ確保行番号
  75. */
  76. void KcMemoryEntry_set(KcMemoryEntry *entry,
  77. size_t size, KcMemoryMark mark, const char *file, const char *func, int line)
  78. {
  79. if (entry != NULL)
  80. {
  81. entry->size = size;
  82. entry->mark = mark;
  83. entry->file = file;
  84. entry->func = func;
  85. entry->line = line;
  86. entry->_prev = NULL;
  87. entry->_next = NULL;
  88. entry->data = (entry + 1);
  89. }
  90. }