ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-UUlib/uulib/safealloc.c
Revision: 1.1
Committed: Fri Jul 10 01:17:08 2015 UTC (8 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-1_8, rel-1_71, rel-1_5, rel-1_62, rel-1_7, rel-1_6, HEAD
Log Message:
*** empty log message ***

File Contents

# Content
1 /* enable the POSIX prototypes of mmap/munmap on Solaris */
2 #ifdef __sun
3 # if __STDC_VERSION__ >= 199901L
4 # define _XOPEN_SOURCE 600
5 # else
6 # define _XOPEN_SOURCE 500
7 # endif
8 #endif
9
10 #ifndef _WIN32
11 #include <unistd.h>
12 #endif
13
14 #if !defined USE_MMAP \
15 && _POSIX_MAPPED_FILES > 0 \
16 && (_POSIX_VERSION >= 200809L || _POSIX_MEMORY_PROTECTION > 0)
17 #include <sys/mman.h>
18 #if !defined MAP_ANONYMOUS && defined MAP_ANON
19 #define MAP_ANONYMOUS MAP_ANON
20 #endif
21 #ifdef MAP_ANONYMOUS
22 #include <limits.h>
23 #if PAGESIZE <= 0
24 static long pagesize;
25 #define PAGESIZE pagesize ? pagesize : (pagesize = sysconf (_SC_PAGESIZE))
26 #endif
27 #define USE_MMAP 1
28 #endif
29 #endif
30
31 /* we assume natural alignment, uulib only uses ints and chars */
32 #define ALIGN 1
33 #define GUARDS 4
34
35 static void *
36 safe_alloc (size_t size)
37 {
38 #if USE_MMAP
39
40 size_t rounded = (size + ALIGN - 1) & ~(ALIGN - 1);
41 size_t page = PAGESIZE;
42 size_t page_rounded = (rounded + page - 1) & ~(page - 1);
43 void *base = mmap (0, page_rounded + page * GUARDS * 2, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
44
45 if (base == (void *)-1)
46 return 0;
47
48 mprotect (base, page * GUARDS, PROT_NONE); /* beginning */
49 mprotect (page_rounded + page * GUARDS + (char *)base, page * GUARDS, PROT_NONE); /* end */
50
51 return page * GUARDS + (page_rounded - rounded) + (char *)base;
52
53 #else
54 return malloc (size);
55 #endif
56 }
57
58 static void
59 safe_free (void *mem, size_t size)
60 {
61 #if USE_MMAP
62
63 size_t rounded = (size + ALIGN - 1) & ~(ALIGN - 1);
64 size_t page = PAGESIZE;
65 size_t page_rounded = (rounded + page - 1) & ~(page - 1);
66
67 if (!mem)
68 return;
69
70 mem = (char *)mem - page * GUARDS - (page_rounded - rounded);
71
72 munmap (mem, page_rounded + page * GUARDS * 2);
73
74 #else
75 free (size);
76 #endif
77 }
78