Sylpheed RE agent a60fe7d11c [RE] threading_posix: fix a lost resume that left CREATE_SUSPENDED threads dead
A thread created suspended publishes its state and its suspend count in TWO
separate lock scopes:

    { lock; state_ = kSuspended; notify_all(); }        // lock released here
    if (create_suspended) { lock; suspend_count_ = 1; wait(count == 0); }

and Resume() does WaitStarted() - which waits only for state_ != kUninitialized -
followed by `if (suspend_count_ == 0) return false;`. So a resumer can slip into
the gap: it sees the thread started, sees suspend_count_ still 0, drops the
resume and returns false. The new thread then sets the count to 1 and waits on it
forever. A textbook lost wakeup.

Measured in Project Sylpheed. Pressing (A) on the title makes the game do
XamUserGetXUID -> NtCreateEvent -> ExCreateThread(entry=821748F0,
CREATE_SUSPENDED) -> NtResumeThread, and the loader thread then never ran: zero
kernel calls of its own (it appeared in the log only as an argument) and 00:00:00
host CPU time, while the emulator sat at 546% CPU. Boots reached the main menu
1 time in 6.

Fixed by publishing state_ and suspend_count_ under one lock and waiting without
releasing it, so a resumer past WaitStarted() always observes 1.

On the first clean boot after the fix the same loader thread is the CALLER on 20
kernel-call lines and issues 4 ResolvePath asset reads. Every failed boot before
it had exactly zero of both.

Also logs when the host resume is refused. XThread::Resume's Linux path
discarded that bool - the Windows path turns it into X_STATUS_UNSUCCESSFUL - so a
dropped resume was invisible from both sides. Note the log is not by itself a
defect: resuming a thread that is not suspended legitimately returns false, and
it fires ~7 times in a normal boot.
2026-08-19 10:41:05 +00:00
2026-03-27 11:17:55 +09:00
2025-11-20 03:53:43 -08:00
2025-11-20 03:53:41 -08:00
2025-11-20 03:53:41 -08:00

Xenia Canary - Xbox 360 Emulator

Xenia Canary is an experimental fork of the Xenia emulator. For more information, see the Xenia Canary wiki.

Come chat with us about emulator-related topics on Discord. For developer chat join #dev but stay on topic. Lurking is not only fine, but encouraged! Please check the FAQ page before asking questions. We've got jobs/lives/etc, so don't expect instant answers.

Discussing illegal activities will get you banned.

Status

Buildbot Status Releases
Canary (🪟, 🐧) CI Codacy Badge LatestAllOld

Experimental Netplay

Buildbot Status Releases
Windows Codacy Badge Latest

Quickstart

See the Quickstart page.

FAQ

See the frequently asked questions page.

Game Compatibility

See the Game compatibility list for currently tracked games, and feel free to contribute your own updates, screenshots, and information there following the existing conventions.

Building

See building.md for setup and information about the xb script. When writing code, check the style guide and be sure to run clang-format!

Contributors Wanted!

Have some spare time, know advanced C++, and want to write an emulator? Contribute! There's a ton of work that needs to be done, a lot of which is wide open greenfield fun.

For general rules and guidelines please see CONTRIBUTING.md.

Fixes and optimizations are always welcome (please!), but in addition to that there are some major work areas still untouched:

See more projects good for contributors. It's a good idea to ask on Discord and check the issues page before beginning work on something.

Disclaimer

The goal of this project is to experiment, research, and educate on the topic of emulation of modern devices and operating systems. It is not for enabling illegal activity. All information is obtained via reverse engineering of legally purchased devices and games and information made public on the internet (you'd be surprised what's indexed on Google...).

Description
No description provided
Readme BSD-3-Clause 71 MiB
Languages
C++ 97.8%
Python 1%
CMake 0.4%
GLSL 0.2%
HLSL 0.2%
Other 0.2%