Giter VIP home page Giter VIP logo

Comments (4)

lukecheeseman avatar lukecheeseman commented on July 28, 2024

Talking with @plietar; the trace visits iso fields before the finaliser runs, so the field is found to have no more references and gets GC'd too early.

from verona.

plietar avatar plietar commented on July 28, 2024

When an object is collected, three things
need to happen:

  1. run the user-defined finaliser
  2. find all iso fields
  3. delete VMObject’s std::unique_ptr<FieldValue[]>

2 must run before 3, and in order to support the “extract and send subregions” pattern in finalisers, 1 must run before 2.

However, currently from the runtime’s point of view, 1 and 3 are both part of VMObject’s finaliser and run together, before 2 does.

Possible solutions:

  • expose a new hook in the runtime for step 3, distinguishing between an object’s finaliser and its destructor.
  • let the finaliser trace the iso fields, allowing the VM to do all steps in the order it wants
  • get rid of step 3, by storing the fields inline with the VMObject storage. This could be done with a C99 “flexible array member”, but it’s not very friendly to do in C++. In particular computing the size of the VMObject becomes tricky.

Before we had a VM, the runtime actually did trace the iso fields before running the finaliser, but I swapped those when introducing the fields array.

from verona.

plietar avatar plietar commented on July 28, 2024

Note that when storing a string in a field, FieldValue’s destructor will also call std::string’s destructor. If we get rid of step 3 then we’d have to do this elsewhere (possibly in the finaliser).

from verona.

plietar avatar plietar commented on July 28, 2024

@mjp41 has pointed out that we can’t destroy the fields array until all the finalisers in the region have run, as they could be traversing fields of other objects. Similarly we can’t be deallocating strings in the finaliser either (the strings should really be implemented as their own Verona object though).

If we want to keep the unique_ptr for the fields, what we really need is a second pass through the ring to run the destructors.

from verona.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.