1include(CheckIncludeFile)
2include(CheckLibraryExists)
3include(CheckSymbolExists)
4include(CheckFunctionExists)
5include(CheckCSourceCompiles)
6
7# Check for mmap() support, required for HAVE_MPOOL.
8#
9# checks for private fixed mappings, we don't need fixed mappings,
10# so check only wether private mappings work.
11check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
12if(MMAP_FOR_CROSSCOMPILING)
13    set(HAVE_MMAP 1)
14else()
15    check_c_source_compiles(
16        "
17            #include <unistd.h>
18            #include <stdlib.h>
19            #include <sys/mman.h>
20            #ifdef HAVE_SYS_TYPES_H
21            #include <sys/types.h>
22            #endif
23            #ifdef HAVE_SYS_STAT_H
24            #include <sys/stat.h>
25            #endif
26            #include <fcntl.h>
27            #define ERR(e) do { status = e; goto done; } while(0)
28            int main(void)
29            {
30                char *data = NULL, *data2 = MAP_FAILED, *data3 = NULL;
31                size_t i, datasize = 1024;
32                int fd = -1, status = 0;
33
34                /* First, make a file with some known garbage in it. */
35                data = (char*) malloc(datasize);
36                if(!data)
37                    ERR(1);
38                for(i=0;i<datasize;i++)
39                    *(data + i) = rand();
40                umask(0);
41                fd = creat(\"conftest.mmap\", 0600);
42                if(fd < 0)
43                    ERR(1);
44                if(write (fd, data, datasize) != datasize)
45                    ERR(1);
46                close(fd);
47                fd = open(\"conftest.mmap\", O_RDWR);
48                if (fd < 0)
49                    ERR(1);
50                /* Next, try to create a private map of the file. If we can, also make sure that
51                   we see the same garbage.  */
52                data2 = mmap(NULL, datasize, PROT_READ | PROT_WRITE,
53                    MAP_PRIVATE, fd, 0L);
54                if(data2 == MAP_FAILED)
55                    ERR(2);
56                for(i=0;i<datasize;i++)
57                    if(*(data + i) != *(data2+ i))
58                        ERR(3);
59                /* Finally, make sure that changes to the mapped area do not
60                   percolate back to the file as seen by read().
61                   (This is a bug on some variants of i386 svr4.0.)  */
62                for (i = 0; i < datasize; ++i)
63                    *(data2 + i) = *(data2 + i) + 1;
64                data3 = (char*) malloc(datasize);
65                if(!data3)
66                    ERR(1);
67                if(read (fd, data3, datasize) != datasize)
68                    ERR(1);
69                for(i=0;i<datasize;i++)
70                    if(*(data + i) != *(data3 + i))
71                        ERR(3);
72            done:
73                if(fd >= 0)
74                    close(fd);
75                if(data3)
76                    free(data3);
77                if(data2 != MAP_FAILED)
78                    munmap(data2, datasize);
79                if(data)
80                    free(data);
81                return status;
82            }
83        "
84        HAVE_MMAP
85    )
86endif()
87
88# Check the flag name for the ANONYMOUS_MAP feature.
89check_c_source_compiles(
90    "
91        #include <sys/mman.h>
92        int main(void)
93        {
94            mmap((void *)0, 0, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
95            return 0;
96        }
97    "
98    HAVE_MMAP_MAP_ANONYMOUS
99)
100if(HAVE_MMAP_MAP_ANONYMOUS)
101    set(ANONYMOUS_MAP MAP_ANONYMOUS)
102else()
103    check_c_source_compiles(
104        "
105            /* OPENBSD WORKAROUND - DND*/
106            #include <sys/types.h>
107            /* OPENBSD WORKAROUND - END*/
108            #include <sys/mman.h>
109            int main(void)
110            {
111                mmap((void *)0, 0, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
112                return 0;
113            }
114        "
115        HAVE_MMAP_MAP_ANON
116    )
117    if(HAVE_MMAP_MAP_ANON)
118        set(ANONYMOUS_MAP MAP_ANON)
119    endif()
120endif()
121
122# Check for getting the pagesize.
123check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE)
124check_c_source_compiles(
125    "
126        #include <sys/types.h>
127        #include <unistd.h>
128        int main(void)
129        {
130            int x = sysconf(_SC_PAGESIZE);
131            return 0;
132        }
133    "
134    HAVE_SYSCONF_SC_PAGESIZE
135)
136
137# Check for mempool support
138if(DISABLE_MPOOL)
139    message("****** mempool support disabled (DISABLE_MPOOL enabled)")
140elseif(NOT HAVE_MMAP)
141    message("****** mempool support disabled (mmap() not available or not usable)")
142elseif(NOT HAVE_GETPAGESIZE AND NOT HAVE_SYSCONF_SC_PAGESIZE)
143    message("****** mempool support disabled (pagesize cannot be determined)")
144elseif(NOT HAVE_MMAP_MAP_ANON AND NOT HAVE_MMAP_MAP_ANONYMOUS)
145    message("****** mempool support disabled (anonymous mmap not available)")
146else()
147    set(USE_MPOOL 1)
148endif()
149