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, 11 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

# User Rev Content
1 root 1.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