[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot
, '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

[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot
, '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

[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot
, '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

[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot
, '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

[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot
, '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

[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot
, '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

[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot
, '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

[mono] Add headers for unstable APIs - #33869

Merged
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers
Mar 23, 2020
Merged

[mono] Add headers for unstable APIs#33869
lambdageek merged 2 commits into
dotnet:masterfrom
lambdageek:add-mono-unstable-api-headers

Conversation

@lambdageek

Copy link
Copy Markdown
Member

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.

Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
-fvisisibility=hidden, and we would like to discourage declaring the
functions in the embedder's own headers.

The functions that go into the
mono/{utils,metadata,jit}/mono-private-unstable.h headers will all be marked
with MONO_API MONO_RT_EXTERNAL_ONLY but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.

We have functions that are de-facto part of the Mono embedding API that are
used by Xamarin.iOS or Xamarin.Android that are not in a state where we want to
commit to supporting them forever in their current form.
Nonetheless, we would like to make sure that the symbols for these functions
are visible even if we otherwise compile the runtime with
`-fvisisibility=hidden`, and we would like to discourage declaring the
functions in the embedder's own headers.
The functions that go into the
`mono/{utils,metadata,jit}/mono-private-unstable.h` headers will all be marked
with `MONO_API MONO_RT_EXTERNAL_ONLY` but we will not guarantee that the
functions will be there from one release to the next or that they will not
change their signatures or their behaviors.
@lambdageek

Copy link
Copy Markdown
MemberAuthor

Attn: @vargaz@migueldeicaza

@lambdageek

Copy link
Copy Markdown
MemberAuthor

An example where we might want to use this header is for mono_install_load_aot_data_hook and mono_gc_init_finalizer_thread from #33736

From that PR:

  • mono_install_load_aot_data_hook was already a MONO_API, but it was not in a public header. See https://github.com/xamarin/xamarin-macios/blob/master/runtime/exports.t4
  • mono_gc_init_finalizer_thread was used by Xamarin.iOS for a long time without being in any public header. It's one of the reasons we have to compile Mono for XI with --disable-visibility-hidden. Make the function a proper MONO_API unconditionally - but make it do nothing if the runtime is compiled without --with-lazy-thread-creation (the default).

@lambdageek

Copy link
Copy Markdown
MemberAuthor

FYI @jkotas

@lambdageek

This comment has been minimized.

@lambdageeklambdageek changed the title RFC: [mono] Add headers for unstable APIs[mono] Add headers for unstable APIsMar 20, 2020
@jaykrell

Copy link
Copy Markdown
Contributor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal. I understand the implications -- each platform/architecture gets different names.
Alternatively, a policy of changing the name when changing signature.

@lambdageek
lambdageekforce-pushed the add-mono-unstable-api-headers branch from 0d8fd42 to 34c3cebCompareMarch 20, 2020 22:19
@lambdageek

lambdageek commented Mar 20, 2020

Copy link
Copy Markdown
MemberAuthor

Perhaps this set should be extern "C++" (with a C++ wrapper even), so that signature changes are fatal.

Problem is that some embedders like mono/tests/libtest.c or Xamarin.iOS will use dlsym to get at these symbols so mangling the name to include the types will cause us pain.

Alternatively, a policy of changing the name when changing signature.

yea that's an interesting idea. I would say changing the semantics should also require a name change (though that may be harder to catch). Maybe just bumping some numeric suffic on each function name. Nothing says unstable like mono_zombo_init_37

@jaykrell

Copy link
Copy Markdown
Contributor

I understand the dlsym part, but that is not insurmountable.
The names are discoverable.
People do use GetProcAddress and dlsym with mangled names.
Some kind of "manual name mangling" is easier but not enforced.

@lambdageek
lambdageek merged commit ccada16 into dotnet:masterMar 23, 2020
@ghostghost locked as resolved and limited conversation to collaborators Dec 10, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lambdageek@jaykrell@vargaz@Dotnet-GitSync-Bot