Skip to content

Haiku: Initial managed libraries support#121880

Open
trungnt2910 wants to merge 2 commits intodotnet:mainfrom
trungnt2910:dev/trungnt2910/haiku-lib-corelib
Open

Haiku: Initial managed libraries support#121880
trungnt2910 wants to merge 2 commits intodotnet:mainfrom
trungnt2910:dev/trungnt2910/haiku-lib-corelib

Conversation

@trungnt2910
Copy link
Copy Markdown
Contributor

This contains the code required to build the first managed runtime libraries for Haiku, namely System.Private.CoreLib.

Part of #55803.

Copilot AI review requested due to automatic review settings November 21, 2025 14:26
@github-actions github-actions bot added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 21, 2025
@dotnet-policy-service dotnet-policy-service bot added the community-contribution Indicates that the PR has been added by a community member label Nov 21, 2025
@trungnt2910 trungnt2910 force-pushed the dev/trungnt2910/haiku-lib-corelib branch from 540d8bb to f20b31c Compare November 21, 2025 14:34
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds initial managed libraries support for Haiku OS by implementing the necessary interop and environment code for System.Private.CoreLib. The changes enable basic Haiku platform detection and working set memory queries.

  • Adds Haiku OS platform detection with TARGET_HAIKU constant
  • Implements WorkingSet property for Haiku using native area_info API
  • Provides comprehensive Haiku OS interop definitions (teams, threads, areas, system info)

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Adds TARGET_HAIKU constant to platform name detection
src/libraries/System.Private.CoreLib/src/System/Environment.Haiku.cs Implements WorkingSet property for Haiku by iterating process memory areas
src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems Configures conditional compilation for Haiku and includes required interop files
src/libraries/Common/src/Interop/Haiku/Interop.OS.cs Defines comprehensive Haiku OS interop structures, enums, and P/Invoke methods for process/thread/memory management
src/libraries/Common/src/Interop/Haiku/Interop.Libraries.cs Defines libroot library constant for Haiku interop
Comments suppressed due to low confidence (3)

src/libraries/Common/src/Interop/Haiku/Interop.OS.cs:209

  • The parameter documentation is incorrect. The who parameter is of type BTeamUsage (an enum specifying self or children), not "The thread ID". It should describe that this parameter specifies whether to get usage information for the team itself or its children.
    src/libraries/Common/src/Interop/Haiku/Interop.OS.cs:252
  • The parameter documentation should use <see cref="system_info"/> instead of just "system_info" for consistency with other parameter documentation in this file (e.g., lines 159, 170, 181, 210, 230, 242).
    src/libraries/Common/src/Interop/Haiku/Interop.OS.cs:86
  • The enum name thread_state uses snake_case which is inconsistent with C# naming conventions and the pattern used by other enums in this file (BTeamUsage, BPriority). It should be renamed to ThreadState to follow PascalCase naming convention.

@am11 am11 added area-System.Runtime os-haiku and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners labels Nov 21, 2025
@trungnt2910
Copy link
Copy Markdown
Contributor Author

C/c @am11

Haiku's System.Diagnostics.Process depends on this so I will open that one later.

@am11
Copy link
Copy Markdown
Member

am11 commented Nov 21, 2025

Haiku's System.Diagnostics.Process depends on this so I will open that one later.

Each library has its own review team, and they’ll use your tests as a measure of correctness while providing feedback mainly on efficiency and code style. The individual PRs don’t need to build (there’s no Haiku CI here).

You could open two or three PRs in parallel if you want to speed up the upstream process (since you already have these patches in your fork tested for a while).

@trungnt2910
Copy link
Copy Markdown
Contributor Author

Haiku's System.Diagnostics.Process depends on this so I will open that one later.

What I meant was the two share a common file, Interop.OS.cs, so it will be hard to have both open concurrently.

internal const int B_OS_NAME_LENGTH = 32;

[LibraryImportAttribute(Interop.Libraries.libroot, SetLastError = false)]
private static unsafe partial int _get_next_area_info(int team, ref nint cookie, out area_info areaInfo, nuint size);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The comment on this in haiku header files says

https://github.com/haiku/haiku/blob/d39ce117e02d3d8aac966b1a46bd955a2b59c069/headers/os/kernel/OS.h#L111

Is it ok to be depending on "system private" surface here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@waddlesplash How likely are the _get_next_[*]_info functions going to break?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Additionally, is ABI stability (beyond source compatibility) supported on Haiku?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The alternative is to convert those macros into symbols in System.Native.* then LibraryImport those 🤔

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Additionally, is ABI stability (beyond source compatibility) supported on Haiku?

I am quite sure ABI compatibility within a major release is supported.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Going by that SystemNative_Sysctl (and many others) pattern, you would create a file called pal_area_info.c or something similar (filename is agnostic of OS) and then #ifdef HAVE_xx where #else case is (void)foo; // unsed for other platforms. This pattern keeps the internal entrypoint accounting same across platforms.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The issue here would be _get_next_area_info is not the only API I need to pull in.

#121883 pulls in a bunch of other functions in a similar manner. Therefore, I think an OS-guarded file similar to src/native/libs/System.Native/pal_iossupportversion.m would be better?

Furthermore, sysctl is quite among the UNIX-like OSes, despite some differences among the flavors, while _get_next_area_info is Haiku-specific, so #ifdef TARGET_HAIKU would make more sense than #ifdef HAVE_xx.

Finally, with those functions being confirmed as public and ABI stable from the Haiku side, can't we just keep the current implementation and LibraryImport directly?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Furthermore, sysctl is quite among the UNIX-like OSes, despite some differences among the flavors, while _get_next_area_info is Haiku-specific, so #ifdef TARGET_HAIKU would make more sense than #ifdef HAVE_xx.

We are only using sysctl on FreeBSD.

During the port work, try fitting into the most prevalent existing pattern especially when it has given pause to the reviewers and pointed out in docs #121880 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@trungnt2910 Are the next steps here clear? I understand it as a consensus around creating pal_area_info.c as that would be most consistent with our existing patterns.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@jeffhandley No, there is not a consensus at that time.

That said, I have updated the code with what I think is a good compromise:

  • We no longer P/Invoke directly, resolving @jkotas's concern.
  • The native code is guarded using a Haiku-specific OS.h header check, instead of guarding for Haiku itself, resolving @am11's concern.
  • We keep the current area_info layout as a private source-compatible snapshot, AreaInfo, which is passed to and from the native glue function. This resolves my own concern of ABI compatibility.
  • We make the file pal_getosinfo.c instead. This prevents spawning a whole file just for get_next_area_info, since we will need to pull 6-7 other get_next_[*]_info functions in the future. getosinfo captures both the reliance on the OS.h header and the get_[*]_info function family in Haiku without guarding it specifically for Haiku.

@jeffhandley jeffhandley added the needs-author-action An issue or pull request that requires more info or actions from the author. label Feb 1, 2026
@trungnt2910
Copy link
Copy Markdown
Contributor Author

Still tracking, will take action soon.

@dotnet-policy-service dotnet-policy-service bot removed needs-author-action An issue or pull request that requires more info or actions from the author. no-recent-activity labels Feb 17, 2026
@jeffhandley jeffhandley added the needs-author-action An issue or pull request that requires more info or actions from the author. label Mar 23, 2026
@trungnt2910
Copy link
Copy Markdown
Contributor Author

Thanks for the reminder, and sorry for the delay. I will take action as soon as I can.

@dotnet-policy-service dotnet-policy-service bot removed needs-author-action An issue or pull request that requires more info or actions from the author. no-recent-activity labels Apr 6, 2026
@jkotas jkotas marked this pull request as draft April 6, 2026 15:26
@trungnt2910 trungnt2910 force-pushed the dev/trungnt2910/haiku-lib-corelib branch from f20b31c to 265e06b Compare April 9, 2026 09:57
Copilot AI review requested due to automatic review settings April 9, 2026 10:25
@trungnt2910 trungnt2910 force-pushed the dev/trungnt2910/haiku-lib-corelib branch from 265e06b to acf2867 Compare April 9, 2026 10:25
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

@trungnt2910
Copy link
Copy Markdown
Contributor Author

Local Haiku bootstrap builds are succeeding (after also applying #126701 and making some llvm-libunwind blocks compatible with downstream .NET patches - not sure the right way to do the latter).

The CI failures seem like unrelated WASM/Android targets. Most targets are passing.

Therefore, I am marking this PR for review again.

@trungnt2910 trungnt2910 marked this pull request as ready for review April 9, 2026 12:02
@trungnt2910 trungnt2910 force-pushed the dev/trungnt2910/haiku-lib-corelib branch from acf2867 to eef1222 Compare April 9, 2026 13:51
@trungnt2910 trungnt2910 requested a review from jkotas April 9, 2026 13:53
This contains the code required to build the first managed runtime
libraries for Haiku, namely `System.Private.CoreLib`.

Co-authored-by: Jessica Hamilton <jessica.l.hamilton@gmail.com>
Copilot AI review requested due to automatic review settings April 9, 2026 14:04
@trungnt2910 trungnt2910 force-pushed the dev/trungnt2910/haiku-lib-corelib branch from eef1222 to 54ada29 Compare April 9, 2026 14:04
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

Comment on lines +14 to +22
nint cookie = 0;
long workingSet = 0;

Interop.OS.AreaInfo areaInfo;

while (Interop.OS.GetNextAreaInfo(ProcessId, ref cookie, out areaInfo) == 0)
{
workingSet += areaInfo.ram_size;
}
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

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

Environment.WorkingSet is queried by runtime metrics/event counters and may be polled frequently. This implementation performs a full area enumeration via SystemNative_GetNextAreaInfo on every call (O(number of areas)), which could become noticeably expensive for processes with many mapped regions. If Haiku exposes a direct API for resident/working set size, prefer that; otherwise consider adding a cheaper fast-path or caching within a short time window to reduce syscall/iteration overhead.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

If Haiku exposes a direct API for resident/working set size

@waddlesplash Does Haiku expose such an API? team_info doesn't seem to have such a field.

otherwise consider adding a cheaper fast-path or caching within a short time window to reduce syscall/iteration overhead.

On the library level this may cause unintended stale information. I'd say if any counters want this, it's their job to cache.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

We don't at present, no.

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

Labels

area-System.Runtime community-contribution Indicates that the PR has been added by a community member os-haiku

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants