FinalizationRegistry.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. * Copyright (c) 2021-2022, Idan Horowitz <idan.horowitz@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/SinglyLinkedList.h>
  8. #include <LibJS/Heap/GCPtr.h>
  9. #include <LibJS/Runtime/FunctionObject.h>
  10. #include <LibJS/Runtime/GlobalObject.h>
  11. #include <LibJS/Runtime/JobCallback.h>
  12. #include <LibJS/Runtime/Object.h>
  13. #include <LibJS/Runtime/Value.h>
  14. #include <LibJS/Runtime/WeakContainer.h>
  15. namespace JS {
  16. class FinalizationRegistry final
  17. : public Object
  18. , public WeakContainer {
  19. JS_OBJECT(FinalizationRegistry, Object);
  20. JS_DECLARE_ALLOCATOR(FinalizationRegistry);
  21. public:
  22. virtual ~FinalizationRegistry() override = default;
  23. void add_finalization_record(Cell& target, Value held_value, Cell* unregister_token);
  24. bool remove_by_token(Cell& unregister_token);
  25. ThrowCompletionOr<void> cleanup(Optional<JobCallback> = {});
  26. virtual void remove_dead_cells(Badge<Heap>) override;
  27. Realm& realm() { return *m_realm; }
  28. Realm const& realm() const { return *m_realm; }
  29. JobCallback& cleanup_callback() { return m_cleanup_callback; }
  30. JobCallback const& cleanup_callback() const { return m_cleanup_callback; }
  31. private:
  32. FinalizationRegistry(Realm&, JobCallback, Object& prototype);
  33. virtual void visit_edges(Visitor& visitor) override;
  34. NonnullGCPtr<Realm> m_realm;
  35. JobCallback m_cleanup_callback;
  36. struct FinalizationRecord {
  37. GCPtr<Cell> target;
  38. Value held_value;
  39. GCPtr<Cell> unregister_token;
  40. };
  41. SinglyLinkedList<FinalizationRecord> m_records;
  42. };
  43. }