Skip to content

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

@reflectronic@jeffhandley@danmoseley@jkotas@tannergooding@terrajobst@buyaa-n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Replace usages of Marshal.AllocHGlobal with malloc in libraries by reflectronic · Pull Request #54468 · dotnet/runtime · GitHub
Skip to content

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

@reflectronic@jeffhandley@danmoseley@jkotas@tannergooding@terrajobst@buyaa-n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Replace usages of Marshal.AllocHGlobal with malloc in libraries by reflectronic · Pull Request #54468 · dotnet/runtime · GitHub
Skip to content

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

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

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

@reflectronic@jeffhandley@danmoseley@jkotas@tannergooding@terrajobst@buyaa-n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Replace usages of Marshal.AllocHGlobal with malloc in libraries by reflectronic · Pull Request #54468 · dotnet/runtime · GitHub
Skip to content

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

@reflectronic@jeffhandley@danmoseley@jkotas@tannergooding@terrajobst@buyaa-n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Replace usages of Marshal.AllocHGlobal with malloc in libraries by reflectronic · Pull Request #54468 · dotnet/runtime · GitHub
Skip to content

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

@reflectronic@jeffhandley@danmoseley@jkotas@tannergooding@terrajobst@buyaa-n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Replace usages of Marshal.AllocHGlobal with malloc in libraries by reflectronic · Pull Request #54468 · dotnet/runtime · GitHub
Skip to content

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

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

Replace usages of Marshal.AllocHGlobal with malloc in libraries - #54468

Closed
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal
Closed

Replace usages of Marshal.AllocHGlobal with malloc in libraries#54468
reflectronic wants to merge 63 commits into
dotnet:mainfrom
reflectronic:replace-allochglobal

Conversation

@reflectronic

@reflectronicreflectronic commented Jun 21, 2021

Copy link
Copy Markdown
Contributor

Contributes to #54297

Probably best to review commit-by-commit, I tried not to backtrack too much.

Usages in tests will be addressed in a separate PR.

@ghostghost added the area-Meta label Jun 21, 2021

namespace System
{
internal static unsafe class NativeMemoryHelper

@jkotasjkotasJun 21, 2021

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 should be called NativeMemory and only included for pre-.NET 6 targets. We do not want to have the wrapper on .NET 6+.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That can work for Alloc and Free, but it also has some replacements for Marshal.StringToHGlobalUni that would have to stay on a type like this. Is that okay?

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 would avoid touching StringToHGlobalUni in this PR. If it is useful to have NativeMemory variant of StringToHGlobalUni and similar APIs, we should introduce a proper public API for it first. Duplicating NativeMemory variant of StringToHGlobalUni via private helper is not an improvement over using StringToHGlobalUni directly.

@tannergoodingtannergoodingJun 21, 2021

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 might be worth profiling more and its probably worth opening a proposal.

On my box, a benchmark which does simply the following, over a 260 character string:

varptr=Marshal.StringToHGlobalUni(s);Marshal.FreeHGlobal(ptr);

Compared to an equivalent API using NativeMarshal.Alloc/Free under the covers:

BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19043.1052 (21H1/May2021Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK=6.0.100-preview.5.21302.13
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
| Method | Mean | Error | StdDev |
|-------- |---------:|---------:|---------:|
| Alloc | 41.92 ns | 0.051 ns | 0.045 ns |
| HGlobal | 47.37 ns | 0.071 ns | 0.066 ns |

Of course, in comparison to the GC transition and any work the call itself does, this is probably not that meaningful but ~10% overhead can add up.

@tannergoodingtannergoodingJun 21, 2021

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.

  • To clarify, I don't think anything needs to be done in this PR, just calling out there is a measurable difference here and so it might be worth opening a proposal because of that. In more extreme cases, many Alloc calls can be up to 20x faster than many LocalAlloc calls.

@reflectronic

Copy link
Copy Markdown
ContributorAuthor

I am sorry for the slow turnaround time. I have been on vacation this past week and I will finish this up in the next couple of days.

@terrajobstterrajobst added the community-contribution Indicates that the PR has been added by a community member label Jul 19, 2021
@jeffhandley

Copy link
Copy Markdown
Member

@tannergooding This PR is assigned to you for follow-up/decision before the RC1 snap.

@danmoseley

Copy link
Copy Markdown
Contributor

@reflectronic you might prefer to push commits in groups, as each push restarts the build and test.

@reflectronic

reflectronic commented Jul 30, 2021

Copy link
Copy Markdown
ContributorAuthor

Yes; I am sorry, just got a little lazy, been fixing these last errors on GitHub.

@jeffhandleyjeffhandley added this to the 7.0.0 milestone Aug 19, 2021
@ghostghost closed this Sep 18, 2021
@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for inactivity. Please let us know if you'd like to reopen it.

@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2021
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

7 participants

@reflectronic@jeffhandley@danmoseley@jkotas@tannergooding@terrajobst@buyaa-n