| | |
| | | /* |
| | | Simple DirectMedia Layer |
| | | Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> |
| | | Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> |
| | | |
| | | This software is provided 'as-is', without any express or implied |
| | | warranty. In no event will the authors be held liable for any damages |
| | |
| | | #define MALLOC_FAILURE_ACTION |
| | | #define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ |
| | | #endif /* WIN32 */ |
| | | |
| | | #ifdef __OS2__ |
| | | #define INCL_DOS |
| | | #include <os2.h> |
| | | #define HAVE_MMAP 1 |
| | | #define HAVE_MORECORE 0 |
| | | #define LACKS_SYS_MMAN_H |
| | | #endif /* __OS2__ */ |
| | | |
| | | #if defined(DARWIN) || defined(_DARWIN) |
| | | /* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ |
| | |
| | | #define IS_MMAPPED_BIT (SIZE_T_ONE) |
| | | #define USE_MMAP_BIT (SIZE_T_ONE) |
| | | |
| | | #ifndef WIN32 |
| | | #if !defined(WIN32) && !defined (__OS2__) |
| | | #define CALL_MUNMAP(a, s) munmap((a), (s)) |
| | | #define MMAP_PROT (PROT_READ|PROT_WRITE) |
| | | #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) |
| | |
| | | #endif /* MAP_ANONYMOUS */ |
| | | |
| | | #define DIRECT_MMAP(s) CALL_MMAP(s) |
| | | |
| | | #elif defined(__OS2__) |
| | | |
| | | /* OS/2 MMAP via DosAllocMem */ |
| | | static void* os2mmap(size_t size) { |
| | | void* ptr; |
| | | if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) && |
| | | DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE)) |
| | | return MFAIL; |
| | | return ptr; |
| | | } |
| | | |
| | | #define os2direct_mmap(n) os2mmap(n) |
| | | |
| | | /* This function supports releasing coalesed segments */ |
| | | static int os2munmap(void* ptr, size_t size) { |
| | | while (size) { |
| | | ULONG ulSize = size; |
| | | ULONG ulFlags = 0; |
| | | if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0) |
| | | return -1; |
| | | if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 || |
| | | ulSize > size) |
| | | return -1; |
| | | if (DosFreeMem(ptr) != 0) |
| | | return -1; |
| | | ptr = ( void * ) ( ( char * ) ptr + ulSize ); |
| | | size -= ulSize; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | #define CALL_MMAP(s) os2mmap(s) |
| | | #define CALL_MUNMAP(a, s) os2munmap((a), (s)) |
| | | #define DIRECT_MMAP(s) os2direct_mmap(s) |
| | | |
| | | #else /* WIN32 */ |
| | | |
| | | /* Win32 MMAP via VirtualAlloc */ |
| | |
| | | unique mparams values are initialized only once. |
| | | */ |
| | | |
| | | #ifndef WIN32 |
| | | #if !defined(WIN32) && !defined(__OS2__) |
| | | /* By default use posix locks */ |
| | | #include <pthread.h> |
| | | #define MLOCK_T pthread_mutex_t |
| | |
| | | #endif /* HAVE_MORECORE */ |
| | | |
| | | static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; |
| | | |
| | | #elif defined(__OS2__) |
| | | #define MLOCK_T HMTX |
| | | #define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE) |
| | | #define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT) |
| | | #define RELEASE_LOCK(l) DosReleaseMutexSem(*l) |
| | | #if HAVE_MORECORE |
| | | static MLOCK_T morecore_mutex; |
| | | #endif /* HAVE_MORECORE */ |
| | | static MLOCK_T magic_init_mutex; |
| | | |
| | | #else /* WIN32 */ |
| | | /* |
| | |
| | | } |
| | | RELEASE_MAGIC_INIT_LOCK(); |
| | | |
| | | #ifndef WIN32 |
| | | #if !defined(WIN32) && !defined(__OS2__) |
| | | mparams.page_size = malloc_getpagesize; |
| | | mparams.granularity = ((DEFAULT_GRANULARITY != 0) ? |
| | | DEFAULT_GRANULARITY : mparams.page_size); |
| | | #elif defined (__OS2__) |
| | | /* if low-memory is used, os2munmap() would break |
| | | if it were anything other than 64k */ |
| | | mparams.page_size = 4096u; |
| | | mparams.granularity = 65536u; |
| | | #else /* WIN32 */ |
| | | { |
| | | SYSTEM_INFO system_info; |