register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch
, '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

register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch
, '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

register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch
, '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

register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch
, '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

register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch
, '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

register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch
, '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

register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch
, '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

register all allocas as expected memory leaks - #30

Open
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations
Open

register all allocas as expected memory leaks#30
gabr42 wants to merge 1 commit into
pleriche:masterfrom
gabr42:feature-register-thread-allocations

Conversation

@gabr42

Copy link
Copy Markdown
Contributor

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.

Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).

Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.

Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.

Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.

Implemented two EnableMemoryLeakReporting-mode methods
StartRegisteringAllThreadAllocationsAsExpectedLeaks and
StopRegisteringAllThreadAllocationsAsExpectedLeaks. Windows only.
Rationale: customer calls RegisterPropertyEditor from a program (not
package) and RegisterPropertyEditor creates a memory leak which cannot
be cleaned (local TList in a system unit) and cannot be correctly
registered (Unknown and UnicodeString leaks).
Call StartRegisteringAllThreadAllocationsAsExpectedLeaks to register all
following memory allocations as expected memory leaks.
Call StopRegisteringAllThreadAllocationsAsExpectedLeaks to stop that
behaviour.
Only one thread at a time can be in that state; if a second thread tries
to enter it, it will be blocked until the first thread exits from that
state.
@pleriche

Copy link
Copy Markdown
Owner

Hi Primoz,

Thanks for the contribution. Just two issues I have picked up (please correct me if I am wrong):

  1. It appears that the new Start/StopRegistering... calls are also declared outside of FullDebugMode, but they only have an effect inside FullDebugMode.
  2. While inside this mode should freed memory blocks not automatically be removed from the registered leaks list? I am a bit worried about overflow, since the leaks list is limited to a couple of thousand entries.

Best regards,
Pierre

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@pleriche

pleriche commented Dec 16, 2016

Copy link
Copy Markdown
Owner

FullDebugMode is separate from EnableMemoryLeakReporting: Leak reporting works outside of FullDebugMode as well, but you don't get stack traces.

Regarding the logging of all allocations as leaks, I fear that even if you deregister all blocks in FreeMem that the maximum of about 2300 entries under 32-bit (half under 64-bit) in the registered leak list will still not be enough. It really wasn't designed with this purpose in mind. The code that manages it is also not particularly fast (it performs linear searches), and without a redesign it will become slow if you increase the size of the list.

@gabr42

gabr42 commented Dec 16, 2016 via email

Copy link
Copy Markdown
ContributorAuthor

@the-Arioch

Copy link
Copy Markdown

not very related thought...

May there be a registration of memory blocks, allocated in one thread and freed in another ?

I mean, most of the objects are expected to have a thread-local lives. Owner responsibility is not transferred. But some do, and those some require special measures for access synchronization.

Just a widl idea, that maybe there is both a technical feasibility and a possible benefit to check - for most objects except for specially marked - that they did not passed threads boundary in terms of ownership.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gabr42@pleriche@the-Arioch