lwp_heap.inc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. {$IFDEF OGC_INTERFACE}
  2. { $include machine/asm.inc}
  3. const
  4. HEAP_BLOCK_USED = 1;
  5. HEAP_BLOCK_FREE = 0;
  6. HEAP_DUMMY_FLAG = ( 0 + HEAP_BLOCK_USED );
  7. {$define HEAP_OVERHEAD := (sizeof(cuint32) * 2)}
  8. {$define HEAP_BLOCK_USED_OVERHEAD := (sizeof(pointer) * 2)}
  9. {$define HEAP_MIN_SIZE := (HEAP_OVERHEAD + sizeof(heap_block))}
  10. type
  11. pheap_block = ^_heap_block_st;
  12. _heap_block_st = record
  13. back_flag : cuint32;
  14. front_flag : cuint32;
  15. next : Pheap_block;
  16. prev : Pheap_block;
  17. end;
  18. heap_block = _heap_block_st;
  19. _heap_iblock_st = record
  20. free_blocks : cuint32;
  21. free_size : cuint32;
  22. used_blocks : cuint32;
  23. used_size : cuint32;
  24. end;
  25. heap_iblock = _heap_iblock_st;
  26. pheap_iblock = ^heap_iblock;
  27. _heap_cntrl_st = record
  28. start : Pheap_block;
  29. final : Pheap_block;
  30. first : Pheap_block;
  31. perm_null : Pheap_block;
  32. last : Pheap_block;
  33. pg_size : cuint32;
  34. reserved : cuint32;
  35. end;
  36. heap_cntrl = _heap_cntrl_st;
  37. pheap_cntrl = ^heap_cntrl;
  38. function __lwp_heap_init(theheap: Pheap_cntrl; start_addr: pointer; size, pg_size: cuint32): cuint32; cdecl; external;
  39. function __lwp_heap_allocate(theheap: Pheap_cntrl; size: cuint32): pointer; cdecl; external;
  40. function __lwp_heap_free(theheap: Pheap_cntrl; ptr: pointer): cbool; cdecl; external;
  41. function __lwp_heap_getinfo(theheap: Pheap_cntrl; theinfo: Pheap_iblock): cuint32; cdecl; external;
  42. //{$ifdef LIBOGC_INTERNAL}
  43. //{$include libogc/lwp_heap.inl}
  44. //{$endif}
  45. {$ENDIF}
  46. {$IFDEF OGC_IMPLEMENTATION}
  47. function __lwp_heap_head(theheap: pheap_cntrl): pheap_block;
  48. begin
  49. result := theheap^.start;
  50. end;
  51. function __lwp_heap_tail(heap: pheap_cntrl): pheap_block;
  52. begin
  53. result := heap^.final;
  54. end;
  55. function __lwp_heap_prevblock(block: pheap_block): pheap_block;
  56. begin
  57. result := pheap_block (pcchar(block)^ - (block^.back_flag and not HEAP_BLOCK_USED));
  58. end;
  59. function __lwp_heap_nextblock(block: pheap_block): pheap_block;
  60. begin
  61. result := pheap_block(pcchar(block)^ + (block^.front_flag and not HEAP_BLOCK_USED));
  62. end;
  63. function __lwp_heap_blockat(block: pheap_block; offset: cuint32): pheap_block;
  64. begin
  65. result := pheap_block(pcchar(block) + offset);
  66. end;
  67. function __lwp_heap_usrblockat(ptr: pointer): pheap_block;
  68. var
  69. offset: cuint32;
  70. begin
  71. offset := (pcuint32(ptr)^ - 1);
  72. result := __lwp_heap_blockat(ptr, -offset + (-HEAP_BLOCK_USED_OVERHEAD));
  73. end;
  74. function __lwp_heap_prev_blockfree(block: pheap_block): boolean;
  75. begin
  76. result := (block^.back_flag and HEAP_BLOCK_USED) = 0;
  77. end;
  78. function __lwp_heap_blockfree(block: pheap_block): boolean;
  79. begin
  80. result := (block^.front_flag and HEAP_BLOCK_USED) = 0;
  81. end;
  82. function __lwp_heap_blockused(block: pheap_block): boolean;
  83. begin
  84. result := (block^.front_flag and HEAP_BLOCK_USED) <> 0;
  85. end;
  86. function __lwp_heap_blocksize(block: pheap_block): cuint32;
  87. begin
  88. result := (block^.front_flag and not HEAP_BLOCK_USED);
  89. end;
  90. function __lwp_heap_startuser(block: pheap_block): pointer;
  91. begin
  92. result := pointer(block^.next);
  93. end;
  94. function __lwp_heap_blockin(heap: pheap_cntrl; block: pheap_block): boolean;
  95. begin
  96. result := ((cuint32(block) >= cuint32(heap^.start)) and (cuint32(block) <= cuint32(heap^.final)));
  97. end;
  98. function __lwp_heap_pgsize_valid(pgsize: cuint32): boolean;
  99. begin
  100. result := (pgsize <> 0) and ((pgsize mod PPC_ALIGNMENT) = 0);
  101. end;
  102. function __lwp_heap_buildflag(size, flag: cuint32): cuint32;
  103. begin
  104. result := (size or flag);
  105. end;
  106. {$ENDIF}