diff --git a/Libraries/LibCore/CMakeLists.txt b/Libraries/LibCore/CMakeLists.txt index 7465c41290d..d3136184d5b 100644 --- a/Libraries/LibCore/CMakeLists.txt +++ b/Libraries/LibCore/CMakeLists.txt @@ -22,6 +22,10 @@ serenity_lib(LibCoreMinimal coreminimal) if (WIN32) find_path(DIRENT_INCLUDE_DIR dirent.h REQUIRED) target_include_directories(LibCoreMinimal PRIVATE ${DIRENT_INCLUDE_DIR}) + + find_package(mman REQUIRED) + target_include_directories(LibCoreMinimal PRIVATE ${MMAN_INCLUDE_DIR}) + target_link_libraries(LibCoreMinimal PRIVATE ${MMAN_LIBRARY}) endif() if (LAGOM_TOOLS_ONLY) @@ -110,3 +114,7 @@ endif() if (ANDROID) target_link_libraries(LibCore PRIVATE log) endif() + +if (WIN32) + target_include_directories(LibCore PRIVATE ${MMAN_INCLUDE_DIR}) +endif() diff --git a/Libraries/LibCore/MappedFile.cpp b/Libraries/LibCore/MappedFile.cpp index a9b46c7a77d..c8d45a88f6a 100644 --- a/Libraries/LibCore/MappedFile.cpp +++ b/Libraries/LibCore/MappedFile.cpp @@ -9,9 +9,7 @@ #include #include #include -#include #include -#include namespace Core { @@ -29,10 +27,8 @@ ErrorOr> MappedFile::map_from_file(NonnullOwnPtr> MappedFile::map_from_fd_and_close(int fd, [[maybe_unused]] StringView path, Mode mode) { - TRY(Core::System::fcntl(fd, F_SETFD, FD_CLOEXEC)); - ScopeGuard fd_close_guard = [fd] { - ::close(fd); + (void)System::close(fd); }; auto stat = TRY(Core::System::fstat(fd)); diff --git a/Libraries/LibCore/SystemWindows.cpp b/Libraries/LibCore/SystemWindows.cpp index 9587ec9d10f..c4fe2ed1444 100644 --- a/Libraries/LibCore/SystemWindows.cpp +++ b/Libraries/LibCore/SystemWindows.cpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace Core::System { @@ -166,4 +167,21 @@ ErrorOr fstatat(int, StringView, int) VERIFY_NOT_REACHED(); } +ErrorOr mmap(void* address, size_t size, int protection, int flags, int fd, off_t offset, size_t alignment, StringView) +{ + // custom alignment is not supported + VERIFY(!alignment); + void* ptr = ::mmap(address, size, protection, flags, fd, offset); + if (ptr == MAP_FAILED) + return Error::from_syscall("mmap"sv, -errno); + return ptr; +} + +ErrorOr munmap(void* address, size_t size) +{ + if (::munmap(address, size) < 0) + return Error::from_syscall("munmap"sv, -errno); + return {}; +} + } diff --git a/Meta/CMake/Findmman.cmake b/Meta/CMake/Findmman.cmake new file mode 100644 index 00000000000..ea6ab5aa2c0 --- /dev/null +++ b/Meta/CMake/Findmman.cmake @@ -0,0 +1,2 @@ +find_path(MMAN_INCLUDE_DIR sys/mman.h PATH_SUFFIXES mman) +find_library(MMAN_LIBRARY mman) diff --git a/vcpkg.json b/vcpkg.json index cab66098657..86d8ab31136 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -71,6 +71,10 @@ "simd" ] }, + { + "name": "mman", + "platform": "windows" + }, "simdutf", { "name": "skia",