Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely
, '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

Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely
, '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

Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely
, '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

Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely
, '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

Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely
, '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

Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely
, '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

Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely
, '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

Linux64 support - #62

Open
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support
Open

Linux64 support#62
deadserious wants to merge 2 commits into
pleriche:masterfrom
deadserious:linux64_support

Conversation

@deadserious

Copy link
Copy Markdown

Experimental support for POSIX operating systems

Comment threadFastMM5.pas
@@ -149,7 +149,7 @@ interface
uses
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

perhaps the following pattern would be nicer:
{$IF DEFINED(MSWINDOWS)}
{$ELSEIF DEFINED(POSIX)}
{$MESSAGE ERROR 'Unsupported platform'}
{$ENDIF}

Comment threadFastMM5.pas
{External POSIX function declarations}
function __write(fd: Integer; const buf; count: Integer): Integer; cdecl; external 'libc.so.6' name 'write';
function __close(fd: Integer): Integer; cdecl; external 'libc.so.6' name 'close';
function mmap(addr: Pointer; len: NativeInt; prot: Integer; flags: Integer; fd: Integer; offset: Integer): Pointer; cdecl; external 'libc.so.6' name 'mmap';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

If it is possible to use the Apis as defined in Delphi RTL, as it makes it brittle declaring it here. Using the RTL units should provide correct API binding for each posix platform. This appears to be linux specific.
mmap for example can be used with " Posix.SysMman, Posix.Unistd,", so I'm not sure why these external declarations have been redefined. Is there a good reason?

Comment threadFastMM5.pas
{Shows a message box if the program is not showing one already.}
procedure OS_ShowMessageBox(APText, APCaption: PWideChar);
begin
{$IFDEF MSWINDOWS}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is there a reason you want message box events to be output to the console instead? Console events already get output if configured in var FastMM_OutputDebugStringEvents set. My concern is that it is not doing what the procedure says in its title (its using the console instead of a message box).

Comment threadFastMM5.pas
{The default name of debug support library.}
CFastMM_DefaultDebugSupportLibraryName = {$ifndef 64Bit}'FastMM_FullDebugMode.dll'{$else}'FastMM_FullDebugMode64.dll'{$endif};

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

are constants these required if the appropriate RTL Posix units are used?

Comment threadFastMM5.pas

type

{$IFDEF POSIX}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Posix.SysTypes declares size_t. Is it needed to be redeclared (along with the rest of these)?

Comment threadFastMM5.pas
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetRawStackTrace'));
DebugLibrary_GetFrameBasedStackTrace := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('GetFrameBasedStackTrace'));
DebugLibrary_LogStackTrace_Legacy := GetProcAddress(DebugSupportLibraryHandle, PAnsiChar('LogStackTrace'));
DebugLibrary_GetRawStackTrace := GetProcAddress(DebugSupportLibraryHandle, ('GetRawStackTrace'));

@jdavison-mojdavison-moAug 28, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unlike on Windows which defines LoadLibrary/GetProcAddress in Winapi.Windows, these are defined for posix in System.Sysutils. I suspect this means that these units get initialized before you can install the memory manager, and the default memory manager ends up being effective instead.

Not sure of the impact of dropping PAnsiChar() cast for Windows. (possibly it would cause managed strings to be used which would require a memory manager). (Having said that it does seem to install the memory manager.)

I expect these should be implemented directly.

Comment threadFastMM5.pas
{$ELSE} {$IFDEF POSIX}
System.SysUtils,
System.Math,
Posix.Base,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

System.SysUtils and System.Math should not be used as they will likely cause initialization of the default memory manager.

Posix units probably should be in the implementation section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

However, it doesn't seem to have prevented installation of the memory manager. Mind you, the debug library hasn't been successfully loaded, as I haven't compiled it.

@deadserious

Copy link
Copy Markdown
Author

Thanks, I'll review these comments and see what I can update.

@jdavison-mo

Copy link
Copy Markdown

I can send you some patches if you're interested, that address some of the comments, that I did at the time, but got side tracked if you're interested. Let me know.

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

FastMM_FullDebugMode.pas needs work.

Externally linked version of assembler could potentially be linked to substitute the inline assembler for POSIX since DCC does not support inline asm on LLVM based compilers. Assembler source file should be provided.

procedure GetStackRange(var AStackBaseAddress, ACurrentStackPointer: NativeUInt);
procedure Set8087CW(ANewCW: Word);
procedure SetMXCSR(ANewMXCSR: Cardinal);

implementation required for GetFrameBasedStackTrace

@jdavison-mo

jdavison-mo commented Sep 8, 2025

Copy link
Copy Markdown

@deadserious I've sent you a pull request for my patches I referred to above, that address the review comments I supplied. (On your fork)

@myonlylonely

Copy link
Copy Markdown
Contributor

Is this PR still WIP? It would be great if this is merged.

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

@deadserious@jdavison-mo@myonlylonely