GarbageCollector.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #pragma once
  2. struct Il2CppGuid;
  3. struct Il2CppIUnknown;
  4. struct Il2CppObject;
  5. struct Il2CppThread;
  6. namespace il2cpp
  7. {
  8. namespace gc
  9. {
  10. class LIBIL2CPP_CODEGEN_API GarbageCollector
  11. {
  12. public:
  13. static void Collect(int maxGeneration);
  14. static int32_t CollectALittle();
  15. static int32_t GetCollectionCount(int32_t generation);
  16. static int64_t GetUsedHeapSize();
  17. #if IL2CPP_ENABLE_WRITE_BARRIERS
  18. static void SetWriteBarrier(void **ptr);
  19. static void SetWriteBarrier(void **ptr, size_t numBytes);
  20. #else
  21. static inline void SetWriteBarrier(void **ptr) {}
  22. static inline void SetWriteBarrier(void **ptr, size_t numBytes) {}
  23. #endif
  24. public:
  25. // internal
  26. typedef void (*FinalizerCallback)(void* object, void* client_data);
  27. // functions implemented in a GC agnostic manner
  28. static void UninitializeGC();
  29. static void AddMemoryPressure(int64_t value);
  30. static int32_t GetMaxGeneration();
  31. static int32_t GetGeneration(void* addr);
  32. #if !RUNTIME_TINY
  33. static void InitializeFinalizer();
  34. static bool IsFinalizerThread(Il2CppThread* thread);
  35. static void UninitializeFinalizers();
  36. static void NotifyFinalizers();
  37. static void RunFinalizer(void *obj, void *data);
  38. static void RegisterFinalizerForNewObject(Il2CppObject* obj);
  39. static void RegisterFinalizer(Il2CppObject* obj);
  40. static void SuppressFinalizer(Il2CppObject* obj);
  41. static void WaitForPendingFinalizers();
  42. static Il2CppIUnknown* GetOrCreateCCW(Il2CppObject* obj, const Il2CppGuid& iid);
  43. #endif
  44. // functions implemented in a GC specific manner
  45. static void Initialize();
  46. // Deprecated. Remove when Unity has switched to mono_unity_gc_set_mode
  47. static void Enable();
  48. // Deprecated. Remove when Unity has switched to mono_unity_gc_set_mode
  49. static void Disable();
  50. // Deprecated. Remove when Unity has switched to mono_unity_gc_set_mode
  51. static bool IsDisabled();
  52. static void SetMode(Il2CppGCMode mode);
  53. static bool IsIncremental();
  54. static void StartIncrementalCollection();
  55. static int64_t GetMaxTimeSliceNs();
  56. static void SetMaxTimeSliceNs(int64_t maxTimeSlice);
  57. static FinalizerCallback RegisterFinalizerWithCallback(Il2CppObject* obj, FinalizerCallback callback);
  58. static int64_t GetAllocatedHeapSize();
  59. static void* MakeDescriptorForObject(size_t *bitmap, int numbits);
  60. static void* MakeDescriptorForString();
  61. static void* MakeDescriptorForArray();
  62. #if RUNTIME_TINY
  63. static void* Allocate(size_t size);
  64. #endif
  65. static void* AllocateFixed(size_t size, void *descr);
  66. static void FreeFixed(void* addr);
  67. static bool RegisterThread(void *baseptr);
  68. static bool UnregisterThread();
  69. #if !RUNTIME_TINY
  70. static bool HasPendingFinalizers();
  71. static int32_t InvokeFinalizers();
  72. #endif
  73. static void AddWeakLink(void **link_addr, Il2CppObject *obj, bool track);
  74. static void RemoveWeakLink(void **link_addr);
  75. static Il2CppObject *GetWeakLink(void **link_addr);
  76. /* Used by liveness code */
  77. static void StopWorld();
  78. static void StartWorld();
  79. typedef void (*HeapSectionCallback) (void* user_data, void* start, void* end);
  80. static void ForEachHeapSection(void* user_data, HeapSectionCallback callback);
  81. static size_t GetSectionCount();
  82. typedef void* (*GCCallWithAllocLockCallback)(void* user_data);
  83. static void* CallWithAllocLockHeld(GCCallWithAllocLockCallback callback, void* user_data);
  84. static void RegisterRoot(char *start, size_t size);
  85. static void UnregisterRoot(char* start);
  86. static void SetSkipThread(bool skip);
  87. };
  88. } /* namespace vm */
  89. } /* namespace il2cpp */