Skip to content

Mimalloc header is not installed #116984

Description

@oraluben

Bug report

Bug description:

Mimalloc is introduced in #109914.
This will cause a header not found when building any extension that includes a pycore_*.h header as:

[build] In file included from /Users/yyc/repo/py/install/include/python3.13d/internal/pycore_long.h:13:
[build] In file included from /Users/yyc/repo/py/install/include/python3.13d/internal/pycore_runtime.h:17:
[build] In file included from /Users/yyc/repo/py/install/include/python3.13d/internal/pycore_interp.h:30:
[build] /Users/yyc/repo/py/install/include/python3.13d/internal/pycore_mimalloc.h:39:10: fatal error: 'mimalloc.h' file not found
[build] #include "mimalloc.h"
[build]          ^~~~~~~~~~~~
[build] 1 error generated.

See following PR for detail.

CPython versions tested on:

3.13, CPython main branch

Operating systems tested on:

Linux, macOS

Linked PRs

Activity

  1. pitrou commented on Mar 19, 2024

    @pitrou
    Member

    Slightly unrelated, but I see that mimalloc types are embedded directly in structures such as PyInterpreterState or PyThreadState.

    Unless mimalloc has a stable ABI, does it risk breaking if an extension module or an application embedding Python uses its own different version of mimalloc?

    It's also weird that a third-party library is included from CPython headers. Perhaps it would be better to hide this behind opaque pointers.

    @encukou @colesbury

  2. oraluben commented on Mar 19, 2024

    @oraluben
    ContributorAuthor

    I walked through the discussions in #109914 and seems this issue has been already discussed (at least mentioned, but forgotten later? Or not correctly installed after moved to Internal/? #109914 (review), #109914 (comment), #109914 (comment)). It's somehow intended that this header is not installed, but since cpython decides to install pycore_*.h headers, the mimalloc headers need to be installed as well (otherwise the core headers are all broken).

    I also see some related about this:

    Unless mimalloc has a stable ABI, does it risk breaking if an extension module or an application embedding Python uses its own different version of mimalloc?

    If I'm not mistaken, no symbol is exported (#109914 (comment)), and the reason mimalloc headers are included is that there's extra patches on top of upstream. But the longterm plan is to upstream those (I cannot find the link to this but I believe saw Sam mentioned it somewhere).

    Hope it helped @pitrou

  3. pitrou commented on Mar 19, 2024

    @pitrou
    Member

    If I'm not mistaken, no symbol is exported

    Sure, but:

    1. mimalloc.h is included, and it could come from whatever install of mimalloc is used by third-party extension code, not necessarily the mimalloc used for building CPython
    2. the binary layout of PyInterpreterState and PyThreadState depends on the size of mimalloc types, which may vary from one mimalloc version to another.
  4. colesbury commented on Mar 19, 2024

    @colesbury
    Contributor

    @pitrou:

    1. mimalloc.h is only included in internal headers (pycore_xxx.h). Not in any of the public APIs (Include or Include/cpython).
    2. PyInterpreterState is opaque. The mimalloc structs are included in _PyThreadStateImpl, not PyThreadState. _PyThreadStateImpl is not in any of the public headers.
  5. pitrou commented on Mar 19, 2024

    @pitrou
    Member

    @colesbury This issue shows that "internal" headers are included by third-party code. Presumably, PyInterpreterState and PyThreadState are also consumed by third-party code.

  6. colesbury commented on Mar 19, 2024

    @colesbury
    Contributor

    Yes, people sometimes include our internal headers. People also sometimes copy-paste our internal headers. We don't make attempts to avoid language level name conflicts in these cases.

  7. pitrou commented on Mar 19, 2024

    @pitrou
    Member

    I certainly don't have a horse in this race, but I find it weird to on the one hand fix this issue by installing the mimalloc headers, and on the other hand to not care about the potential consequences of including said headers in third-party code.

  8. oraluben commented on Mar 20, 2024

    @oraluben
    ContributorAuthor

    I'd also prefer to not need to add Internal/mimalloc as extra include path, even after the headers are installed, if that's possible.

  9. added a commit that references this issue on Apr 23, 2024
  10. colesbury commented on May 8, 2024

    @colesbury
    Contributor

    Reopening this for the Internal/mimalloc include path issue.

  11. added 3 commits that reference this issue on May 8, 2024
  12. added a commit that references this issue on May 9, 2024
  13. added a commit that references this issue on May 9, 2024
  14. added a commit that references this issue on May 10, 2024
  15. oraluben commented on May 11, 2024

    @oraluben
    ContributorAuthor

    Closing for the PRs from @colesbury have been landed, thanks for make this more friendly!

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions