Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG) - #127112

Merged
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux
May 4, 2026
Merged

Add Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG)#127112
adamsitnik merged 17 commits into
mainfrom
copilot/extend-kill-on-parent-exit-linux

Conversation

CopilotAI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Description

Adds Linux and Android support for ProcessStartInfo.KillOnParentExit using prctl(PR_SET_PDEATHSIG). Since PR_SET_PDEATHSIG fires when the calling thread exits (not the process), a dedicated long-lived thread is used to perform fork+exec so the signal is only delivered when the process exits.

Key design decisions

  • Dedicated thread: EnsurePDeathSigThread lazily starts a detached thread that lives for the process lifetime. The thread-start check uses a plain bool protected by the mutex (no atomics needed since the check is always done under the mutex).
  • Mutex/condvar synchronization: Callers submit a PDeathSigForkRequest struct to the dedicated thread via a shared pointer, protected by a mutex. Callers wait for s_pdeathsig_request == NULL before submitting to prevent overwriting a pending request, and each request has a per-request done flag to avoid lost-wakeup issues.
  • Orphan detection: After prctl(PR_SET_PDEATHSIG) in the child, a getppid() check detects if the parent died between fork and prctl, since PR_SET_PDEATHSIG will not deliver the signal in that case.
  • KillOnParentExit passed unconditionally: The managed code passes KillOnParentExit to the native shim unconditionally; the native side handles unsupported platforms as a no-op via HAVE_PR_SET_PDEATHSIG.
  • Android support: PR_SET_PDEATHSIG is available on Android, so [SupportedOSPlatform("android")] is added alongside [SupportedOSPlatform("linux")].

CopilotAIand others added 2 commits April 18, 2026 21:45
…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>
@adamsitnik

adamsitnik commented Apr 19, 2026

Copy link
Copy Markdown
Member

@copilot fix following build failure:


FAILED: libs-native/System.Native/CMakeFiles/System.Native-Static.dir/pal_process.c.o /usr/bin/gcc-15 -DBUILDENV_CHECKED=1 -DDEBUG -DDISABLE_CONTRACTS -DHAS_CONSOLE_SIGNALS -DHOST_64BIT -DHOST_AMD64 -DHOST_UNIX -DPALEXPORT=EXTERN_C -DTARGET_64BIT -DTARGET_AMD64 -DTARGET_LINUX -DTARGET_UNIX -DURTBLDENV_FRIENDLY=Checked -D_DBG -D_DEBUG -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/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 -D_GNU_SOURCE -std=gnu11 -fPIC -O2 -Wall -g -fno-omit-frame-pointer -fno-strict-overflow -fno-strict-aliasing -fstack-protector-strong -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-uninitialized -Wno-strict-aliasing -Wno-array-bounds -Wno-stringop-truncation -fsigned-char -fvisibility=hidden -ffunction-sections -I/__w/1/s/src/native/libs/Common -I/__w/1/s/artifacts/obj/coreclr/linux.x64.Checked/libs-native/Common -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: In function ‘PDeathSigThreadFunc’:
/__w/1/s/src/native/libs/System.Native/pal_process.c:411:1: error: no return statement in function returning non-void [-Werror=return-type]
411 | }
| ^
cc1: all warnings being treated as errors

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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:03

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix following build failure:

'''log...

Fixed in dc2712a. Added return NULL; after the infinite while(1) loop to satisfy GCC's -Werror=return-type, with a clang pragma to suppress -Wunreachable-code-return (which was the original reason the return was removed).

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
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>
CopilotAI requested review from Copilot and removed request for CopilotApril 19, 2026 11:44

CopilotAI commented Apr 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the WASM build

'''log...

Fixed in 3723cc4. The ForkAndExecProcessInternal forward declaration was inside the #if HAVE_PR_SET_PDEATHSIG block, so on WASM (where it's 0) it wasn't visible. Moved the forward declaration before the #if block so it's always available.

CopilotAI requested a review from adamsitnikApril 19, 2026 11:45
@adamsitnik
adamsitnik requested review from Copilot and removed request for adamsitnikApril 19, 2026 11:52
…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>
CopilotAI requested review from Copilot and removed request for CopilotMay 3, 2026 20:08
CopilotAI 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
CopilotAI requested a review from adamsitnikMay 3, 2026 20:09
@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android runtime-androidemulator

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@adamsitnik

Copy link
Copy Markdown
Member

/azp run runtime-android

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@adamsitnik
adamsitnik requested a review from jkotasMay 3, 2026 22:14

@adamsitnikadamsitnik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, we just need to update one XML doc sentence

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
CopilotAI review requested due to automatic review settings May 4, 2026 07:23
@adamsitnik
adamsitnik enabled auto-merge (squash) May 4, 2026 07:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/libs/System.Native/pal_process.c
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
tmds
tmds approved these changes May 4, 2026

@tmdstmds left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, I left some suggestions.

… 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>
Comment threadsrc/native/libs/System.Native/pal_process.c Outdated
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Diagnostics.Processos-linuxLinux OS (any supported distro)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Kill System.Diagnostics.Process on parent death

5 participants

@adamsitnik@jkotas@tmds