Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deallocate ThinBox even if the value unwinds on drop #106239

Merged
merged 1 commit into from
Jan 4, 2023

Conversation

LegionMammal978
Copy link
Contributor

This makes it match the behavior of an ordinary Box.

@rustbot
Copy link
Collaborator

rustbot commented Dec 29, 2022

r? @m-ou-se

(rustbot has picked a reviewer for you, use r? to override)

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 29, 2022
@rustbot
Copy link
Collaborator

rustbot commented Dec 29, 2022

Hey! It looks like you've submitted a new PR for the library teams!

If this PR contains changes to any rust-lang/rust public library APIs then please comment with @rustbot label +T-libs-api -T-libs to tag it appropriately. If this PR contains changes to any unstable APIs please edit the PR description to add a link to the relevant API Change Proposal or create one if you haven't already. If you're unsure where your change falls no worries, just leave it as is and the reviewer will take a look and make a decision to forward on if necessary.

Examples of T-libs-api changes:

  • Stabilizing library features
  • Introducing insta-stable changes such as new implementations of existing stable traits on existing stable types
  • Introducing new or changing existing unstable library APIs (excluding permanently unstable features / features without a tracking issue)
  • Changing public documentation in ways that create new stability guarantees
  • Changing observable runtime behavior of library APIs

@m-ou-se
Copy link
Member

m-ou-se commented Dec 30, 2022

r? @Amanieu (because this is about panic in Drop)

@rustbot rustbot assigned Amanieu and unassigned m-ou-se Dec 30, 2022
@Amanieu
Copy link
Member

Amanieu commented Jan 2, 2023

@bors r+

@bors
Copy link
Contributor

bors commented Jan 2, 2023

📌 Commit ce28b4d has been approved by Amanieu

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jan 2, 2023
@LegionMammal978
Copy link
Contributor Author

I've noticed that Rc<T> and Arc<T> also leak their allocations (by not decrementing the shared weak count) if drop_in_place() unwinds. Is there some perf or soundness reason behind this, or is it also unintentional?

@Amanieu
Copy link
Member

Amanieu commented Jan 2, 2023

Panics in drop are known to leak memory in all sorts of places since it's so hard to handle them reliably. Hence my attempt in rust-lang/rfcs#3288 to make panics in drop always abort.

@LegionMammal978
Copy link
Contributor Author

The only place they can leak memory is with types with custom Drop impls. I've looked through all the stdlib heap containers: for the most part, we're very careful about correctly proceeding after a panic. Only the types imported from external crates (mpsc channels, HashMap<K, V, S>, HashSet<T, S>, and related types) fail to drop remaining elements after a panic, and only those as well as ThinBox<T> (before this PR), Rc<T>, and Arc<T> fail to deallocate the backing memory. The unstable DrainFilter types are inconsistent as to whether they continue draining, but they already have issues with panicking closures, so I'm not very surprised. Apart from those, all types use a drop guard and/or delegate to operations like drop_in_place::<[T]>() which correctly handle panics.

(And my position on silently changing the stable behavior of Drop hasn't changed since you proposed it.)

@bors
Copy link
Contributor

bors commented Jan 4, 2023

⌛ Testing commit ce28b4d with merge df75643...

@bors
Copy link
Contributor

bors commented Jan 4, 2023

☀️ Test successful - checks-actions
Approved by: Amanieu
Pushing df75643 to master...

@bors bors added the merged-by-bors This PR was explicitly merged by bors. label Jan 4, 2023
@bors bors merged commit df75643 into rust-lang:master Jan 4, 2023
@rustbot rustbot added this to the 1.68.0 milestone Jan 4, 2023
@rust-timer
Copy link
Collaborator

Finished benchmarking commit (df75643): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

This benchmark run did not return any relevant results for this metric.

Max RSS (memory usage)

Results

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-1.2% [-1.2%, -1.2%] 2
All ❌✅ (primary) - - 0

Cycles

This benchmark run did not return any relevant results for this metric.

@LegionMammal978 LegionMammal978 deleted the thin-box-drop-guard branch May 15, 2023 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
merged-by-bors This PR was explicitly merged by bors. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-libs Relevant to the library team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants