Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
Merged
adamsitnik merged 17 commits intomainfrom May 4, 2026
Merged
Conversation
…R_SET_PDEATHSIG)
Implements PR_SET_PDEATHSIG-based KillOnParentExit on Linux using a dedicated
long-lived thread to ensure the death signal fires on process exit, not thread exit.
Changes:
- Add HAVE_PR_SET_PDEATHSIG cmake check and config
- Add killOnParentExit parameter to SystemNative_ForkAndExecProcess
- Implement dedicated pdeathsig thread with mutex/condvar synchronization
- Call prctl(PR_SET_PDEATHSIG, SIGKILL) in child after fork
- Pass KillOnParentExit through managed interop layer
- Add [SupportedOSPlatform("linux")] to ref and impl
- Enable KillOnParentExitTests on Linux
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/85b53068-8457-4ee3-bdbf-4339fc5a007e
Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
…necessary prctl in thread, improve getppid comment Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/85b53068-8457-4ee3-bdbf-4339fc5a007e Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Copilot created this pull request from a session on behalf of
adamsitnik
April 18, 2026 21:58
View session
Member
|
@copilot fix following build failure: |
Add return NULL after infinite while(1) loop to satisfy GCC's -Werror=return-type, with clang pragma to suppress -Wunreachable-code-return. Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/2659e9ab-8d2c-48d8-a7af-d5356d056e46 Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Contributor
Author
adamsitnik
reviewed
Apr 19, 2026
Member
There was a problem hiding this comment.
@copilot fix the WASM build
FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o
/__w/1/s/src/mono/browser/emsdk/emscripten/emcc -DCOMPILER_SUPPORTS_W_RESERVED_IDENTIFIER -DDISABLE_CONTRACTS -DGEN_PINVOKE=1 -DHOST_32BIT=1 -DHOST_BROWSER -DHOST_UNIX -DHOST_WASM -DNDEBUG -DTARGET_32BIT -DTARGET_BROWSER -DTARGET_UNIX -DTARGET_WASM -DTARGET_WASM32 -DURTBLDENV_FRIENDLY=Retail -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/browser.wasm.Release/libs-native/System.Native -I/__w/1/s/src/native/libs/System.Native -I/__w/1/s/src/native -I/__w/1/s/src/native/inc -std=gnu99 -Wno-declaration-after-statement -Wno-pre-c11-compat -O3 -DNDEBUG -std=gnu11 -fwasm-exceptions -mbulk-memory -msimd128 -O3 -Wall -Wno-null-conversion -glldb -Wno-unused-parameter -Wno-alloca -Wno-implicit-int-float-conversion -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -Werror -Wno-unused-variable -Wno-unused-value -Wno-unused-function -Wno-tautological-compare -Wno-unknown-pragmas -Wimplicit-fallthrough -Wno-unused-but-set-variable -ffp-contract=off -Wno-unknown-warning-option -ferror-limit=4096 -Wno-unused-private-field -Wno-constant-logical-operand -Wno-pragma-pack -Wno-incompatible-ms-struct -Wno-reserved-identifier -Wno-unsafe-buffer-usage -Wno-single-bit-bitfield-constant-conversion -Wno-cast-function-type-strict -Wno-switch-default -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/browser.wasm.Release/libs-native/Common -Oz -Weverything -Wno-format-nonliteral -Wno-disabled-macro-expansion -Wno-padded -Wno-empty-translation-unit -Wno-cast-align -Wno-typedef-redefinition -Wno-thread-safety-analysis -Wno-c11-extensions -Wno-pre-c11-compat -MD -MT libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o -MF libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o.d -o libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o -c /__w/1/s/src/native/libs/System.Native/pal_process.c
/__w/1/s/src/native/libs/System.Native/pal_process.c:537:12: error: call to undeclared function 'ForkAndExecProcessInternal'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
537 | return ForkAndExecProcessInternal(
| ^
/__w/1/s/src/native/libs/System.Native/pal_process.c:544:16: error: static declaration of 'ForkAndExecProcessInternal' follows non-static declaration
544 | static int32_t ForkAndExecProcessInternal(
| ^
/__w/1/s/src/native/libs/System.Native/pal_process.c:537:12: note: previous implicit declaration is here
537 | return ForkAndExecProcessInternal(
| ^
2 errors generated.
Move ForkAndExecProcessInternal forward declaration outside #if HAVE_PR_SET_PDEATHSIG so it's visible on all platforms (fixes WASM build). Simplify return NULL in PDeathSigThreadFunc by removing pragma guards. Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/0261d155-fd8a-43c3-80bc-9085dec73b97 Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Contributor
Author
…ndroid support Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/7d461b6e-4e3b-451c-b496-397402d75d53 Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
Copilot
AI
changed the title
Add Linux support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)
Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)
May 3, 2026
Member
|
/azp run runtime-android runtime-androidemulator |
|
No pipelines are associated with this pull request. |
Member
|
/azp run runtime-android |
|
Azure Pipelines successfully started running 1 pipeline(s). |
jkotas
approved these changes
May 3, 2026
adamsitnik
approved these changes
May 4, 2026
Member
adamsitnik
left a comment
There was a problem hiding this comment.
LGTM, we just need to update one XML doc sentence
Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
tmds
reviewed
May 4, 2026
tmds
reviewed
May 4, 2026
… call under mutex; update orphan-check comment Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/4461470f-ca8e-45c7-b43a-5462587db7d2 Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com>
jkotas
reviewed
May 4, 2026
Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/d9dfd77d-8e4a-4f81-be02-e37aa63b1e6c Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds Linux and Android support for
ProcessStartInfo.KillOnParentExitusingprctl(PR_SET_PDEATHSIG). SincePR_SET_PDEATHSIGfires when the calling thread exits (not the process), a dedicated long-lived thread is used to performfork+execso the signal is only delivered when the process exits.Key design decisions
EnsurePDeathSigThreadlazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plainboolprotected by the mutex (no atomics needed since the check is always done under the mutex).PDeathSigForkRequeststruct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait fors_pdeathsig_request == NULLbefore submitting to prevent overwriting a pending request, and each request has a per-requestdoneflag to avoid lost-wakeup issues.prctl(PR_SET_PDEATHSIG)in the child, agetppid()check detects if the parent died betweenforkandprctl, sincePR_SET_PDEATHSIGwill not deliver the signal in that case.KillOnParentExitpassed unconditionally: The managed code passesKillOnParentExitto the native shim unconditionally; the native side handles unsupported platforms as a no-op viaHAVE_PR_SET_PDEATHSIG.PR_SET_PDEATHSIGis available on Android, so[SupportedOSPlatform("android")]is added alongside[SupportedOSPlatform("linux")].