Skip to content

[x86_64-fortanix-unknown-sgx] Failing stdlib threading test #150053

@sardok

Description

@sardok

After PR-144465 got merged, the test named test_named_thread (in library/src/std/thread/tests.rs) started failing for sgx target. I managed to find that, the breaking change is ThreadInit refactoring. For some reason, the call to set_current in ThreadInit::init looks ineffective. When i move set_current & set_name calls from ThreadInit::init to the rust_start closure (just like pre-PR), the test passes.

Here the changes that fixes this failure:

diff --git a/library/std/src/thread/mod.rs b/library/std/src/thread/mod.rs
index 983d189b070..0565c4ba98f 100644
--- a/library/std/src/thread/mod.rs
+++ b/library/std/src/thread/mod.rs
@@ -229,14 +229,15 @@ pub fn init(self: Box<Self>) -> Box<dyn FnOnce() + Send> {
         // so that it may call std::thread::current() in its implementation. This is also
         // why we take Box<Self>, to ensure the Box is not destroyed until after this point.
         // Cloning the handle does not invoke the global allocator, it is an Arc.
-        if let Err(_thread) = set_current(self.handle.clone()) {
-            // The current thread should not have set yet. Use an abort to save binary size (see #123356).
-            rtabort!("current thread handle already set during thread spawn");
-        }
+        // if let Err(_thread) = set_current(self.handle.clone()) {
+        //     // The current thread should not have set yet. Use an abort to save binary size (see #123356).
+        //     rtabort!("current thread handle already set during thread spawn");
+        // }

-        if let Some(name) = self.handle.cname() {
-            imp::set_name(name);
-        }
+        // if let Some(name) = self.handle.cname() {
+        //     imp::set_name(name);
+        // }
+        let _ = self.handle;

         self.rust_start
     }
@@ -572,10 +573,21 @@ fn drop(&mut self) {
         }

         let f = MaybeDangling::new(f);
+        let their_thread = thread.clone();

         // The entrypoint of the Rust thread, after platform-specific thread
         // initialization is done.
         let rust_start = move || {
+
+            if let Err(_thread) = set_current(their_thread.clone()) {
+                // The current thread should not have set yet. Use an abort to save binary size (see #123356).
+                rtabort!("current thread handle already set during thread spawn");
+            }
+
+            if let Some(name) = their_thread.cname() {
+                imp::set_name(name);
+            }
+
             let f = f.into_inner();
             let try_result = panic::catch_unwind(panic::AssertUnwindSafe(|| {
                 crate::sys::backtrace::__rust_begin_short_backtrace(|| hooks.run());

The PR-144465 is in beta branch now.

Thank you.

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.O-SGXTarget: SGXT-libsRelevant to the library team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions