Skip to content

Disposal should be based on a DAG, not a stack (e.g. AsyncDisposableDag) #246

Open
@alexweej

Description

AS A Node.js developer
I WANT to not spend more wall-clock time disposing of async resources than necessary
SO THAT my applications do not feel sluggish compared to other languages

Resources have construction dependencies, which are naturally expressed by having to pass dependencies as arguments, e.g.

const mySession = await ThingySession.create();
const myFrobnicatorService = await FrobnicatorService.create(mySession);

When disposing of these resources, it's reasonable but not correct to assume that there is a LIFO destruction order requirement. In theory, if you know that myFrobnicatorService does not retain a reference to mySession, you can dispose of both resources in parallel, without waiting for myFrobnicatorService to dispose first before starting to dispose of mySession.

This issue naturally extends to more complex DAGs of dependency relationships (equivalently, lifetime constraints). Crucially, you cannot in general infer anything about the optimal disposal plan.

Just as a starting point for a solution, perhaps having a protocol for a resource[Symbol.resourceDependencies] property which returns a Set of resources, can give us the information we need to dispose of things with the shortest critical path, i.e. disposing of resources as soon as they no longer have dependents. If this [Symbol.disposeDependencies] property is undefined, then fall back to LIFO disposal.

Thanks

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions