Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis
, '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

Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis
, '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

Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis
, '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

Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis
, '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

Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis
, '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

Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis
, '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

Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis
, '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

Remove ThreadPool native implementation - #71719

Merged
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation
Aug 21, 2022
Merged

Remove ThreadPool native implementation#71719
jkotas merged 22 commits into
dotnet:mainfrom
eduardo-vp:update/remove-threadpool-native-implementation

Conversation

@eduardo-vp

@eduardo-vpeduardo-vp commented Jul 6, 2022

Copy link
Copy Markdown
Member

Cleaning up the thread pool native implementation, removing ThreadpoolMgr::UsePortableThreadPool() and ThreadpoolMgr::UsePortableThreadPoolForIO() and assume the calls to those functions to always return true.

Deleting all the functions and code that became unused.

@ghost

ghost commented Jul 6, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:eduardo-vp
Assignees:eduardo-vp
Labels:

area-System.Threading

Milestone:-

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

I like this. I see a couple of functions called by the AppDomain class which now look unnecessary, but other than that everything looks pretty good to me.

Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/threadpoolrequest.cpp Outdated
Comment threadsrc/coreclr/vm/hillclimbing.cpp
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
Comment threadsrc/coreclr/inc/sospriv.idl
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/debug/daccess/request.cpp
Comment threadsrc/coreclr/System.Private.CoreLib/src/System/Threading/Overlapped.cs Outdated
Comment threadsrc/coreclr/vm/win32threadpool.cpp Outdated
…Pool.CoreCLR.cs
Co-authored-by: Stephen Toub <stoub@microsoft.com>
@stephentoub
stephentoub marked this pull request as ready for review July 10, 2022 01:18
@@ -120,9 +85,6 @@ internal sealed unsafe class OverlappedData

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern OverlappedData GetOverlappedFromNative(NativeOverlapped* nativeOverlappedPtr);

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.

How about porting the rest of the Overlapped fcalls to managed code? Especially GetOverlappedFromNative whose implementation is trivial (just casting a pointer and a couple of dereferences) would be benefitted from being inlined by the JIT.

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.

Yes, there are more follow up improvements that can be done here. Not as part of this PR through.

@deeprobin

Copy link
Copy Markdown
Contributor

I'm currently not that familiar with the internal ThreadPool APIs.

But it is a good step into the future that this PR will be merged and the ThreadPool stuff will be converted into managed code.

Will we get this merged before the .NET 7 release?


Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.


#if CORECLR
#pragma warning disable CA1823
private static readonly bool s_initialized = ThreadPool.EnsureConfigInitialized();

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.

What is the reason to use an unused field here?
Where is this used?

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.

This is used to ensure that the threadpool config is initialized. It is the minimal change to preserve the existing initialization flow.

As mentioned above, there are more cleanups that can be done here, not part of this PR.

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.

Okay. I was thinking of a static constructor, but of course it works that way too.

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.

Adding regular static constructor would add static constructor triggers to all static methods that may introduce performance regressions.

Comment threadsrc/coreclr/debug/daccess/request.cpp
@jkotas

Copy link
Copy Markdown
Member

Just out of interest: Could you maybe provide some benchmarks? Just to make sure there are no major regressions.

@deeprobin This is result of several years long effort. It was benchmarked extensively along the way, see for example #64834 , #71864 , #38225 .

@kouvelkouvel added this to the 8.0.0 milestone Jul 12, 2022
@kouvel

kouvel commented Jul 12, 2022

Copy link
Copy Markdown
Contributor

Marked for .NET 8 for now. The full switchover to the portable thread pool has only completed in .NET 7 and the intention was to leave the fallback switches in place for .NET 7.

@stephentoubstephentoub added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 12, 2022

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

Just a few comments, otherwise LGTM, thanks!


SOSDacLeave();
return hr;
return E_NOTIMPL;

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.

The SOS ThreadPool command would not work after this, it would need to be updated such that it continues to show info from the portable thread pool when receiving an E_NOTIMPL from this API, while keeping the legacy paths for backward compatibility.

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.

Comment threadsrc/coreclr/vm/ecalllist.h Outdated
Comment threadsrc/coreclr/vm/threads.h
Comment threadsrc/coreclr/vm/win32threadpool.cpp
@jkotasjkotas removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Aug 20, 2022

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

What I can judge: LGTM.
I am looking forward to the change 👍🏼.

@jkotas
jkotas merged commit bcd44bf into dotnet:mainAug 21, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 20, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@eduardo-vp@deeprobin@jkotas@kouvel@stephentoub@davidwrighton@teo-tsirpanis