2 * D header file for POSIX.
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Sean Kelly, Alex Rønne Petersen
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
10 /* Copyright Sean Kelly 2005 - 2009.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
15 module core.sys.posix.sys.mman;
17 private import core.sys.posix.config;
18 public import core.sys.posix.sys.types; // for off_t, mode_t
26 else version (WatchOS)
29 version (ARM) version = ARM_Any;
30 version (AArch64) version = ARM_Any;
31 version (HPPA) version = HPPA_Any;
32 version (HPPA64) version = HPPA_Any;
33 version (MIPS32) version = MIPS_Any;
34 version (MIPS64) version = MIPS_Any;
35 version (PPC) version = PPC_Any;
36 version (PPC64) version = PPC_Any;
37 version (RISCV32) version = RISCV_Any;
38 version (RISCV64) version = RISCV_Any;
39 version (S390) version = IBMZ_Any;
40 version (SPARC) version = SPARC_Any;
41 version (SPARC64) version = SPARC_Any;
42 version (SystemZ) version = IBMZ_Any;
43 version (X86) version = X86_Any;
44 version (X86_64) version = X86_Any;
47 extern (C) nothrow @nogc:
50 // Advisory Information (ADV)
53 int posix_madvise(void*, size_t, int);
57 // Advisory Information and either Memory Mapped Files or Shared Memory Objects (MC1)
67 version (CRuntime_Glibc)
70 private enum __POSIX_MADV_DONTNEED = 6;
72 private enum __POSIX_MADV_DONTNEED = 4;
74 static if (__USE_XOPEN2K)
78 POSIX_MADV_NORMAL = 0,
79 POSIX_MADV_RANDOM = 1,
80 POSIX_MADV_SEQUENTIAL = 2,
81 POSIX_MADV_WILLNEED = 3,
82 POSIX_MADV_DONTNEED = __POSIX_MADV_DONTNEED,
84 int posix_madvise(void *__addr, size_t __len, int __advice);
89 enum POSIX_MADV_NORMAL = 0;
90 enum POSIX_MADV_RANDOM = 1;
91 enum POSIX_MADV_SEQUENTIAL = 2;
92 enum POSIX_MADV_WILLNEED = 3;
93 enum POSIX_MADV_DONTNEED = 4;
94 int posix_madvise(void *addr, size_t len, int advice);
96 else version (FreeBSD)
98 enum POSIX_MADV_NORMAL = 0;
99 enum POSIX_MADV_RANDOM = 1;
100 enum POSIX_MADV_SEQUENTIAL = 2;
101 enum POSIX_MADV_WILLNEED = 3;
102 enum POSIX_MADV_DONTNEED = 4;
103 int posix_madvise(void *addr, size_t len, int advice);
105 else version (NetBSD)
107 enum POSIX_MADV_NORMAL = 0;
108 enum POSIX_MADV_RANDOM = 1;
109 enum POSIX_MADV_SEQUENTIAL = 2;
110 enum POSIX_MADV_WILLNEED = 3;
111 enum POSIX_MADV_DONTNEED = 4;
112 int posix_madvise(void *addr, size_t len, int advice);
114 else version (OpenBSD)
116 enum POSIX_MADV_NORMAL = 0;
117 enum POSIX_MADV_RANDOM = 1;
118 enum POSIX_MADV_SEQUENTIAL = 2;
119 enum POSIX_MADV_WILLNEED = 3;
120 enum POSIX_MADV_DONTNEED = 4;
121 int posix_madvise(void *addr, size_t len, int advice);
123 else version (DragonFlyBSD)
125 enum POSIX_MADV_NORMAL = 0;
126 enum POSIX_MADV_RANDOM = 1;
127 enum POSIX_MADV_SEQUENTIAL = 2;
128 enum POSIX_MADV_WILLNEED = 3;
129 enum POSIX_MADV_DONTNEED = 4;
130 int posix_madvise(void *addr, size_t len, int advice);
132 else version (Solaris)
135 else version (CRuntime_Bionic)
138 else version (CRuntime_Musl)
141 else version (CRuntime_UClibc)
145 POSIX_MADV_NORMAL = 0,
146 POSIX_MADV_RANDOM = 1,
147 POSIX_MADV_SEQUENTIAL = 2,
148 POSIX_MADV_WILLNEED = 3,
149 POSIX_MADV_DONTNEED = 4,
151 int posix_madvise(void *__addr, size_t __len, int __advice);
155 static assert(false, "Unsupported platform");
159 // Memory Mapped Files, Shared Memory Objects, or Memory Protection (MC2)
168 version (CRuntime_Glibc)
170 enum PROT_NONE = 0x0;
171 enum PROT_READ = 0x1;
172 enum PROT_WRITE = 0x2;
173 enum PROT_EXEC = 0x4;
175 else version (Darwin)
177 enum PROT_NONE = 0x00;
178 enum PROT_READ = 0x01;
179 enum PROT_WRITE = 0x02;
180 enum PROT_EXEC = 0x04;
182 else version (FreeBSD)
184 enum PROT_NONE = 0x00;
185 enum PROT_READ = 0x01;
186 enum PROT_WRITE = 0x02;
187 enum PROT_EXEC = 0x04;
189 else version (NetBSD)
191 enum PROT_NONE = 0x00;
192 enum PROT_READ = 0x01;
193 enum PROT_WRITE = 0x02;
194 enum PROT_EXEC = 0x04;
196 else version (OpenBSD)
198 enum PROT_NONE = 0x00;
199 enum PROT_READ = 0x01;
200 enum PROT_WRITE = 0x02;
201 enum PROT_EXEC = 0x04;
203 else version (DragonFlyBSD)
205 enum PROT_NONE = 0x00;
206 enum PROT_READ = 0x01;
207 enum PROT_WRITE = 0x02;
208 enum PROT_EXEC = 0x04;
210 else version (Solaris)
212 enum PROT_NONE = 0x00;
213 enum PROT_READ = 0x01;
214 enum PROT_WRITE = 0x02;
215 enum PROT_EXEC = 0x04;
217 else version (CRuntime_Bionic)
219 enum PROT_NONE = 0x00;
220 enum PROT_READ = 0x01;
221 enum PROT_WRITE = 0x02;
222 enum PROT_EXEC = 0x04;
224 else version (CRuntime_Musl)
226 enum PROT_NONE = 0x0;
227 enum PROT_READ = 0x1;
228 enum PROT_WRITE = 0x2;
229 enum PROT_EXEC = 0x4;
231 else version (CRuntime_UClibc)
233 enum PROT_NONE = 0x0;
234 enum PROT_READ = 0x1;
235 enum PROT_WRITE = 0x2;
236 enum PROT_EXEC = 0x4;
240 static assert(false, "Unsupported platform");
244 // Memory Mapped Files, Shared Memory Objects, or Typed Memory Objects (MC3)
247 void* mmap(void*, size_t, int, int, int, off_t);
248 int munmap(void*, size_t);
251 version (CRuntime_Glibc)
253 static if (__USE_LARGEFILE64) void* mmap64(void*, size_t, int, int, int, off_t);
254 static if (__USE_FILE_OFFSET64)
257 void* mmap(void*, size_t, int, int, int, off_t);
258 int munmap(void*, size_t);
260 else version (Darwin)
262 void* mmap(void*, size_t, int, int, int, off_t);
263 int munmap(void*, size_t);
265 else version (FreeBSD)
267 void* mmap(void*, size_t, int, int, int, off_t);
268 int munmap(void*, size_t);
270 else version (NetBSD)
272 void* mmap(void*, size_t, int, int, int, off_t);
273 int munmap(void*, size_t);
275 else version (OpenBSD)
277 void* mmap(void*, size_t, int, int, int, off_t);
278 int munmap(void*, size_t);
280 else version (DragonFlyBSD)
282 void* mmap(void*, size_t, int, int, int, off_t);
283 int munmap(void*, size_t);
285 else version (Solaris)
287 void* mmap(void*, size_t, int, int, int, off_t);
288 int munmap(void*, size_t);
290 else version (CRuntime_Bionic)
292 void* mmap(void*, size_t, int, int, int, off_t);
293 int munmap(void*, size_t);
295 else version (CRuntime_Musl)
297 static if (__USE_LARGEFILE64) void* mmap64(void*, size_t, int, int, int, off_t);
298 static if (__USE_FILE_OFFSET64)
301 void* mmap(void*, size_t, int, int, int, off_t);
302 int munmap(void*, size_t);
304 else version (CRuntime_UClibc)
306 static if (__USE_LARGEFILE64) void* mmap64(void*, size_t, int, int, int, off64_t);
307 static if (__USE_FILE_OFFSET64)
310 void* mmap(void*, size_t, int, int, int, off_t);
311 int munmap(void*, size_t);
315 static assert(false, "Unsupported platform");
319 // Memory Mapped Files (MF)
329 MS_INVALIDATE (MF|SIO)
331 int msync(void*, size_t, int); (MF|SIO)
334 version (CRuntime_Glibc)
336 enum MAP_SHARED = 0x01;
337 enum MAP_PRIVATE = 0x02;
338 enum MAP_FIXED = 0x10;
340 enum MAP_FAILED = cast(void*) -1;
343 private enum DEFAULTS = true;
346 private enum DEFAULTS = false;
347 enum MAP_ANON = 0x10;
350 enum MS_INVALIDATE = 4;
353 private enum DEFAULTS = true;
354 else version (ARM_Any)
355 private enum DEFAULTS = true;
356 else version (IBMZ_Any)
357 private enum DEFAULTS = true;
359 private enum DEFAULTS = true;
360 else version (HPPA_Any)
362 private enum DEFAULTS = false;
363 enum MAP_ANON = 0x10;
366 enum MS_INVALIDATE = 4;
369 private enum DEFAULTS = true;
371 private enum DEFAULTS = true;
372 else version (X86_Any)
373 private enum DEFAULTS = true;
374 else version (MIPS_Any)
376 private enum DEFAULTS = false;
377 enum MAP_ANON = 0x0800;
379 enum MS_INVALIDATE = 2;
382 else version (RISCV_Any)
383 private enum DEFAULTS = true;
384 else version (SPARC_Any)
385 private enum DEFAULTS = true;
386 else version (PPC_Any)
387 private enum DEFAULTS = true;
389 static assert(0, "unimplemented");
393 enum MAP_ANON = 0x20;
395 enum MS_INVALIDATE = 2;
399 int msync(void*, size_t, int);
401 else version (Darwin)
403 enum MAP_SHARED = 0x0001;
404 enum MAP_PRIVATE = 0x0002;
405 enum MAP_FIXED = 0x0010;
406 enum MAP_ANON = 0x1000;
408 enum MAP_FAILED = cast(void*)-1;
410 enum MS_ASYNC = 0x0001;
411 enum MS_INVALIDATE = 0x0002;
412 enum MS_SYNC = 0x0010;
414 int msync(void*, size_t, int);
416 else version (FreeBSD)
418 enum MAP_SHARED = 0x0001;
419 enum MAP_PRIVATE = 0x0002;
420 enum MAP_FIXED = 0x0010;
421 enum MAP_ANON = 0x1000;
423 enum MAP_FAILED = cast(void*)-1;
425 enum MS_SYNC = 0x0000;
426 enum MS_ASYNC = 0x0001;
427 enum MS_INVALIDATE = 0x0002;
429 int msync(void*, size_t, int);
431 else version (NetBSD)
433 enum MAP_SHARED = 0x0001;
434 enum MAP_PRIVATE = 0x0002;
435 enum MAP_FIXED = 0x0010;
436 enum MAP_ANON = 0x1000;
438 enum MAP_FAILED = cast(void*)-1;
440 enum MS_SYNC = 0x0004;
441 enum MS_ASYNC = 0x0001;
442 enum MS_INVALIDATE = 0x0002;
444 int __msync13(void*, size_t, int);
445 alias msync = __msync13;
447 else version (OpenBSD)
449 enum MAP_SHARED = 0x0001;
450 enum MAP_PRIVATE = 0x0002;
451 enum MAP_FIXED = 0x0010;
452 enum MAP_ANON = 0x1000;
454 enum MAP_FAILED = cast(void*)-1;
456 enum MS_SYNC = 0x0002;
457 enum MS_ASYNC = 0x0001;
458 enum MS_INVALIDATE = 0x0004;
460 int msync(void*, size_t, int);
462 else version (DragonFlyBSD)
464 enum MAP_SHARED = 0x0001;
465 enum MAP_PRIVATE = 0x0002;
466 enum MAP_FIXED = 0x0010;
467 enum MAP_ANON = 0x1000;
469 enum MAP_FAILED = cast(void*)-1;
471 enum MS_SYNC = 0x0000;
472 enum MS_ASYNC = 0x0001;
473 enum MS_INVALIDATE = 0x0002;
475 int msync(void*, size_t, int);
477 else version (Solaris)
479 enum MAP_SHARED = 0x0001;
480 enum MAP_PRIVATE = 0x0002;
481 enum MAP_FIXED = 0x0010;
482 enum MAP_ANON = 0x0100;
484 enum MAP_FAILED = cast(void*)-1;
486 enum MS_SYNC = 0x0004;
487 enum MS_ASYNC = 0x0001;
488 enum MS_INVALIDATE = 0x0002;
490 int msync(void*, size_t, int);
492 else version (CRuntime_Bionic)
494 enum MAP_SHARED = 0x0001;
495 enum MAP_PRIVATE = 0x0002;
496 enum MAP_FIXED = 0x0010;
497 enum MAP_ANON = 0x0020;
499 enum MAP_FAILED = cast(void*)-1;
503 enum MS_INVALIDATE = 2;
505 int msync(in void*, size_t, int);
507 else version (CRuntime_Musl)
509 enum MAP_SHARED = 0x01;
510 enum MAP_PRIVATE = 0x02;
511 enum MAP_FIXED = 0x10;
513 enum MAP_FAILED = cast(void*) -1;
514 enum MAP_ANON = 0x20;
516 enum MS_INVALIDATE = 2;
518 int msync(void*, size_t, int);
520 else version (CRuntime_UClibc)
522 enum MAP_SHARED = 0x01;
523 enum MAP_PRIVATE = 0x02;
524 enum MAP_FIXED = 0x10;
526 enum MAP_FAILED = cast(void*) -1;
530 enum MAP_ANON = 0x20;
532 enum MS_INVALIDATE = 2;
535 else version (MIPS32)
537 enum MAP_ANON = 0x0800;
539 enum MS_INVALIDATE = 2;
544 enum MAP_ANON = 0x020;
546 enum MS_INVALIDATE = 2;
551 static assert(false, "Architecture not supported.");
555 int msync(void*, size_t, int);
559 static assert(false, "Unsupported platform");
563 // Process Memory Locking (ML)
573 version (CRuntime_Glibc)
575 version (SPARC_Any) enum
577 MCL_CURRENT = 0x2000,
580 else version (PPC_Any) enum
582 MCL_CURRENT = 0x2000,
585 else version (Alpha) enum
600 else version (Darwin)
602 enum MCL_CURRENT = 0x0001;
603 enum MCL_FUTURE = 0x0002;
608 else version (FreeBSD)
610 enum MCL_CURRENT = 0x0001;
611 enum MCL_FUTURE = 0x0002;
616 else version (NetBSD)
618 enum MCL_CURRENT = 0x0001;
619 enum MCL_FUTURE = 0x0002;
624 else version (OpenBSD)
626 enum MCL_CURRENT = 0x0001;
627 enum MCL_FUTURE = 0x0002;
632 else version (DragonFlyBSD)
634 enum MCL_CURRENT = 0x0001;
635 enum MCL_FUTURE = 0x0002;
640 else version (Solaris)
642 enum MCL_CURRENT = 0x0001;
643 enum MCL_FUTURE = 0x0002;
648 else version (CRuntime_Bionic)
650 enum MCL_CURRENT = 1;
656 else version (CRuntime_Musl)
659 else version (CRuntime_UClibc)
673 static assert(false, "Unsupported platform");
677 // Range Memory Locking (MLR)
680 int mlock(in void*, size_t);
681 int munlock(in void*, size_t);
684 version (CRuntime_Glibc)
686 int mlock(in void*, size_t);
687 int munlock(in void*, size_t);
689 else version (Darwin)
691 int mlock(in void*, size_t);
692 int munlock(in void*, size_t);
694 else version (FreeBSD)
696 int mlock(in void*, size_t);
697 int munlock(in void*, size_t);
699 else version (NetBSD)
701 int mlock(in void*, size_t);
702 int munlock(in void*, size_t);
704 else version (OpenBSD)
706 int mlock(in void*, size_t);
707 int munlock(in void*, size_t);
709 else version (DragonFlyBSD)
711 int mlock(in void*, size_t);
712 int munlock(in void*, size_t);
714 else version (Solaris)
716 int mlock(in void*, size_t);
717 int munlock(in void*, size_t);
719 else version (CRuntime_Bionic)
721 int mlock(in void*, size_t);
722 int munlock(in void*, size_t);
724 else version (CRuntime_Musl)
727 else version (CRuntime_UClibc)
729 int mlock(in void*, size_t);
730 int munlock(in void*, size_t);
734 static assert(false, "Unsupported platform");
738 // Memory Protection (MPR)
741 int mprotect(void*, size_t, int);
744 version (CRuntime_Glibc)
746 int mprotect(void*, size_t, int);
748 else version (Darwin)
750 int mprotect(void*, size_t, int);
752 else version (FreeBSD)
754 int mprotect(void*, size_t, int);
756 else version (NetBSD)
758 int mprotect(void*, size_t, int);
760 else version (OpenBSD)
762 int mprotect(void*, size_t, int);
764 else version (DragonFlyBSD)
766 int mprotect(void*, size_t, int);
768 else version (Solaris)
770 int mprotect(void*, size_t, int);
772 else version (CRuntime_Bionic)
774 int mprotect(in void*, size_t, int);
776 else version (CRuntime_Musl)
778 int mprotect(void*, size_t, int);
780 else version (CRuntime_UClibc)
782 int mprotect(void*, size_t, int);
786 static assert(false, "Unsupported platform");
790 // Shared Memory Objects (SHM)
793 int shm_open(in char*, int, mode_t);
794 int shm_unlink(in char*);
797 version (CRuntime_Glibc)
799 int shm_open(in char*, int, mode_t);
800 int shm_unlink(in char*);
802 else version (Darwin)
804 int shm_open(in char*, int, mode_t);
805 int shm_unlink(in char*);
807 else version (FreeBSD)
809 int shm_open(in char*, int, mode_t);
810 int shm_unlink(in char*);
812 else version (NetBSD)
814 int shm_open(in char*, int, mode_t);
815 int shm_unlink(in char*);
817 else version (OpenBSD)
819 int shm_open(in char*, int, mode_t);
820 int shm_unlink(in char*);
822 else version (DragonFlyBSD)
824 int shm_open(in char*, int, mode_t);
825 int shm_unlink(in char*);
827 else version (Solaris)
829 int shm_open(in char*, int, mode_t);
830 int shm_unlink(in char*);
832 else version (CRuntime_Bionic)
835 else version (CRuntime_Musl)
838 else version (CRuntime_UClibc)
840 int shm_open(in char*, int, mode_t);
841 int shm_unlink(in char*);
845 static assert(false, "Unsupported platform");
849 // Typed Memory Objects (TYM)
852 POSIX_TYPED_MEM_ALLOCATE
853 POSIX_TYPED_MEM_ALLOCATE_CONTIG
854 POSIX_TYPED_MEM_MAP_ALLOCATABLE
856 struct posix_typed_mem_info
858 size_t posix_tmi_length;
861 int posix_mem_offset(in void*, size_t, off_t *, size_t *, int *);
862 int posix_typed_mem_get_info(int, struct posix_typed_mem_info *);
863 int posix_typed_mem_open(in char*, int, int);