head 1.1; access; symbols pkgsrc-2026Q1:1.1.0.20 pkgsrc-2026Q1-base:1.1 pkgsrc-2025Q4:1.1.0.18 pkgsrc-2025Q4-base:1.1 pkgsrc-2025Q3:1.1.0.16 pkgsrc-2025Q3-base:1.1 pkgsrc-2025Q2:1.1.0.14 pkgsrc-2025Q2-base:1.1 pkgsrc-2025Q1:1.1.0.12 pkgsrc-2025Q1-base:1.1 pkgsrc-2024Q4:1.1.0.10 pkgsrc-2024Q4-base:1.1 pkgsrc-2024Q3:1.1.0.8 pkgsrc-2024Q3-base:1.1 pkgsrc-2024Q2:1.1.0.6 pkgsrc-2024Q2-base:1.1 pkgsrc-2024Q1:1.1.0.4 pkgsrc-2024Q1-base:1.1 pkgsrc-2023Q4:1.1.0.2 pkgsrc-2023Q4-base:1.1; locks; strict; comment @// @; 1.1 date 2023.11.14.17.57.41; author nia; state Exp; branches; next ; commitid 6j4nJUj41nclxBME; desc @@ 1.1 log @Import emulators/duckstation-qt DuckStation is an simulator/emulator of the Sony PlayStation(TM) console, focusing on playability, speed, and long-term maintainability. The goal is to be as accurate as possible while maintaining performance suitable for low-end devices. A "BIOS" ROM image is required to to start the emulator and to play games. You can use an image from any hardware version or region, although mismatching game regions and BIOS regions may have compatibility issues. @ text @$NetBSD$ NetBSD (and more POSIX platforms) support. --- src/util/memory_arena.cpp.orig 2023-08-12 04:46:09.000000000 +0000 +++ src/util/memory_arena.cpp @@@@ -16,7 +16,7 @@@@ Log_SetChannel(Common::MemoryArena); #include #include #include -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) +#else #include #include #include @@@@ -76,16 +76,14 @@@@ void* MemoryArena::FindBaseAddressForMap base_address = VirtualAlloc(nullptr, size, MEM_RESERVE, PAGE_READWRITE); if (base_address) VirtualFree(base_address, 0, MEM_RELEASE); -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) - base_address = mmap(nullptr, size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0); - if (base_address) - munmap(base_address, size); #elif defined(__ANDROID__) base_address = mmap(nullptr, size, PROT_NONE, MAP_ANON | MAP_SHARED, -1, 0); if (base_address) munmap(base_address, size); #else - base_address = nullptr; + base_address = mmap(nullptr, size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0); + if (base_address) + munmap(base_address, size); #endif if (!base_address) @@@@ -110,13 +108,11 @@@@ static std::string GetFileMappingName() { #if defined(_WIN32) const unsigned pid = GetCurrentProcessId(); -#elif defined(__ANDROID__) || defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) - const unsigned pid = static_cast(getpid()); #else -#error Unknown platform. + const unsigned pid = static_cast(getpid()); #endif - const std::string ret(StringUtil::StdStringFromFormat("duckstation_%u", pid)); + const std::string ret(StringUtil::StdStringFromFormat("/duckstation_%u", pid)); Log_InfoPrintf("File mapping name: %s", ret.c_str()); return ret; } @@@@ -176,11 +172,11 @@@@ bool MemoryArena::Create(size_t size, bo m_writable = writable; m_executable = executable; return true; -#elif defined(__APPLE__) || defined(__FreeBSD__) -#if defined(__APPLE__) - m_shmem_fd = shm_open(file_mapping_name.c_str(), O_CREAT | O_EXCL | (writable ? O_RDWR : O_RDONLY), 0600); #else +#ifdef SHM_ANON m_shmem_fd = shm_open(SHM_ANON, O_CREAT | O_EXCL | (writable ? O_RDWR : O_RDONLY), 0600); +#else + m_shmem_fd = shm_open(file_mapping_name.c_str(), O_CREAT | O_EXCL | (writable ? O_RDWR : O_RDONLY), 0600); #endif if (m_shmem_fd < 0) @@@@ -189,7 +185,7 @@@@ bool MemoryArena::Create(size_t size, bo return false; } -#ifdef __APPLE__ +#ifndef SHM_ANON // we're not going to be opening this mapping in other processes, so remove the file shm_unlink(file_mapping_name.c_str()); #endif @@@@ -205,8 +201,6 @@@@ bool MemoryArena::Create(size_t size, bo m_writable = writable; m_executable = executable; return true; -#else - return false; #endif } @@@@ -218,7 +212,7 @@@@ void MemoryArena::Destroy() CloseHandle(m_file_handle); m_file_handle = nullptr; } -#elif defined(__linux__) || defined(__FreeBSD__) +#elif defined(__linux__) || defined(SHM_ANON) if (m_shmem_fd > 0) { close(m_shmem_fd); @@@@ -256,14 +250,12 @@@@ void* MemoryArena::CreateViewPtr(size_t MapViewOfFileEx(m_file_handle, desired_access, Truncate32(offset >> 32), Truncate32(offset), size, fixed_address); if (!base_pointer) return nullptr; -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) +#else const int flags = (fixed_address != nullptr) ? (MAP_SHARED | MAP_FIXED) : MAP_SHARED; const int prot = PROT_READ | (writable ? PROT_WRITE : 0) | (executable ? PROT_EXEC : 0); base_pointer = mmap(fixed_address, size, prot, flags, m_shmem_fd, static_cast(offset)); if (base_pointer == reinterpret_cast(-1)) return nullptr; -#else - return nullptr; #endif m_num_views.fetch_add(1); @@@@ -274,10 +266,8 @@@@ bool MemoryArena::FlushViewPtr(void* add { #if defined(_WIN32) return FlushViewOfFile(address, size); -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) - return (msync(address, size, 0) >= 0); #else - return false; + return (msync(address, size, 0) >= 0); #endif } @@@@ -286,10 +276,8 @@@@ bool MemoryArena::ReleaseViewPtr(void* a bool result; #if defined(_WIN32) result = static_cast(UnmapViewOfFile(address)); -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) - result = (munmap(address, size) >= 0); #else - result = false; + result = (munmap(address, size) >= 0); #endif if (!result) @@@@ -308,14 +296,12 @@@@ void* MemoryArena::CreateReservedPtr(siz void* base_pointer; #if defined(_WIN32) base_pointer = VirtualAlloc(fixed_address, size, MEM_RESERVE, PAGE_NOACCESS); -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) +#else const int flags = (fixed_address != nullptr) ? (MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED) : (MAP_PRIVATE | MAP_ANONYMOUS); base_pointer = mmap(fixed_address, size, PROT_NONE, flags, -1, 0); if (base_pointer == reinterpret_cast(-1)) return nullptr; -#else - return nullptr; #endif m_num_views.fetch_add(1); @@@@ -327,10 +313,8 @@@@ bool MemoryArena::ReleaseReservedPtr(voi bool result; #if defined(_WIN32) result = static_cast(VirtualFree(address, 0, MEM_RELEASE)); -#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) - result = (munmap(address, size) >= 0); #else - result = false; + result = (munmap(address, size) >= 0); #endif if (!result) @@@@ -354,11 +338,9 @@@@ bool MemoryArena::SetPageProtection(void DWORD old_protect; return static_cast( VirtualProtect(address, length, protection_table[readable][writable][executable], &old_protect)); -#elif defined(__linux__) || defined(__ANDROID__) || defined(__APPLE__) || defined(__FreeBSD__) +#else const int prot = (readable ? PROT_READ : 0) | (writable ? PROT_WRITE : 0) | (executable ? PROT_EXEC : 0); return (mprotect(address, length, prot) >= 0); -#else - return false; #endif } @