Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT
, '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

Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT
, '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

Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT
, '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

Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT
, '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

Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT
, '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

Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT
, '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

Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT
, '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

Store pinned static fields in the Pinned Object Heap. - #89895

Merged
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh
Sep 22, 2023
Merged

Store pinned static fields in the Pinned Object Heap.#89895
jkotas merged 8 commits into
dotnet:mainfrom
teo-tsirpanis:fixedaddressvaluetype-poh

Conversation

@teo-tsirpanis

Copy link
Copy Markdown
Contributor

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes#66043

Now that we don't pin `FixedAddressValueType` fields, this mechanism is unused.
We remove the check that blocked it, enable a test and update a design document.
@ghostghost added area-AssemblyLoader-coreclr only use for closed issues community-contribution Indicates that the PR has been added by a community member labels Aug 2, 2023
@ghost

ghost commented Aug 2, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @vitek-karas, @agocke, @VSadov
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR allocates fields marked with [FixedAddressValueType] to the Pinned Object Heap. We introduce a new overload of AllocateObject that accepts a GC_ALLOC_FLAGS, and when allocating the static fields we pass GC_ALLOC_PINNED_OBJECT_HEAP if the field has that attribute.

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields. All we have to do is remove the check that blocked these assemblies, and unmark the relevant unit test as incompatible with unloadability. I also removed a now-unused tracking mechanism for thread-static pinned fields.

Fixes #66043

Author:teo-tsirpanis
Assignees:-
Labels:

area-AssemblyLoader-coreclr

Milestone:-

@janvorlijanvorli 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, thank you!

Comment threadsrc/coreclr/vm/gchelpers.h
@janvorli

Copy link
Copy Markdown
Member

@teo-tsirpanis you'll also need to remove the library negative test for the FixedAddressValueType attribute and unloadability - it is causing the CI failures.

Comment threadsrc/coreclr/vm/gchelpers.h Outdated
@MichalPetryka

Copy link
Copy Markdown
Contributor

Because we don't use a pinned handle to pin the fields anymore, the object is not permanently held in memory, which enables unloadability for assemblies with pinned static fields.

Worth noting is that this will unload the assembly when the user uses Unsafe.AsPointer on the field since nothing with keep it alive and then such access could corrupt the process.

@mangod9

Copy link
Copy Markdown
Member

@teo-tsirpanis, could you please rebase the PR and then we could run the CI again to get it merged? Thanks

@teo-tsirpanis

Copy link
Copy Markdown
ContributorAuthor

@mangod9 done. CI is green.

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

Thank you!

@jkotas
jkotas merged commit f61d3c7 into dotnet:mainSep 22, 2023
@teo-tsirpanis
teo-tsirpanis deleted the fixedaddressvaluetype-poh branch September 22, 2023 10:21
@teo-tsirpanisteo-tsirpanis mentioned this pull request Sep 23, 2023
@ghostghost locked as resolved and limited conversation to collaborators Oct 22, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-VM-coreclrcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Store static fields with [FixedAddressValueType] in the Pinned Object Heap.

6 participants

@teo-tsirpanis@janvorli@MichalPetryka@mangod9@jkotas@jeffschwMSFT