-#if defined(solaris2_HOST_OS) || defined(irix_HOST_OS)
- {
- int fd = open("/dev/zero",O_RDONLY);
- ret = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
- close(fd);
- }
-#elif hpux_HOST_OS
- ret = mmap(addr, size, PROT_READ | PROT_WRITE,
- MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-#elif darwin_HOST_OS
- // Without MAP_FIXED, Apple's mmap ignores addr.
- // With MAP_FIXED, it overwrites already mapped regions, whic
- // mmap(0, ... MAP_FIXED ...) is worst of all: It unmaps the program text
- // and replaces it with zeroes, causing instant death.
- // This behaviour seems to be conformant with IEEE Std 1003.1-2001.
- // Let's just use the underlying Mach Microkernel calls directly,
- // they're much nicer.
-
- kern_return_t err;
- ret = addr;
- if(addr) // try to allocate at adress
- err = vm_allocate(mach_task_self(),(vm_address_t*) &ret, size, FALSE);
- if(!addr || err) // try to allocate anywhere
- err = vm_allocate(mach_task_self(),(vm_address_t*) &ret, size, TRUE);
-
- if(err) {
- // don't know what the error codes mean exactly, assume it's
- // not our problem though.
- errorBelch("memory allocation failed (requested %lu bytes)", size);
- stg_exit(EXIT_FAILURE);
- } else {
- vm_protect(mach_task_self(),ret,size,FALSE,VM_PROT_READ|VM_PROT_WRITE);