Skip to content

Instantly share code, notes, and snippets.

@osiewicz
Created December 20, 2023 16:31
Show Gist options
  • Save osiewicz/cd7358f1cc7cf50543cac1f4e0b85c53 to your computer and use it in GitHub Desktop.
Save osiewicz/cd7358f1cc7cf50543cac1f4e0b85c53 to your computer and use it in GitHub Desktop.
async-task excessive monomorphization example (https://github.com/smol-rs/async-task/issues/66)
[package]
name = "async-task-stresstest"
version = "0.1.0"
edition = "2021"
[dependencies]
# Apply the provided patch to the local copy of async-task.
async-task = {path = "../../async-task"}
fn main() {
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
let (_, _) = async_task::spawn(async move {}, |_| {});
}
diff --git a/src/runnable.rs b/src/runnable.rs
index 8b1b062..b413d58 100644
--- a/src/runnable.rs
+++ b/src/runnable.rs
@@ -6,7 +6,7 @@ use core::ptr::NonNull;
use core::sync::atomic::Ordering;
use core::task::Waker;
-use alloc::boxed::Box;
+//use alloc::boxed::Box;
use crate::header::Header;
use crate::raw::RawTask;
@@ -513,16 +513,7 @@ impl<M> Builder<M> {
M: 'a,
{
// Allocate large futures on the heap.
- let ptr = if mem::size_of::<Fut>() >= 2048 {
- let future = |meta| {
- let future = future(meta);
- Box::pin(future)
- };
-
- RawTask::<_, Fut::Output, S, M>::allocate(future, schedule, self)
- } else {
- RawTask::<Fut, Fut::Output, S, M>::allocate(future, schedule, self)
- };
+ let ptr = { RawTask::<Fut, Fut::Output, S, M>::allocate(future, schedule, self) };
let runnable = Runnable {
ptr,
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment