annotate src/lib/mmap-util.c @ 22955:812e5c961328

fts: Indexing virtual mailbox didn't always index the last mails
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 03 May 2018 18:33:00 +0300
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "mmap-util.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5
543
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
6 #include <sys/stat.h>
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
7
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
8 void *mmap_file(int fd, size_t *length, int prot)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 {
543
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
10 struct stat st;
43
526284657da7 Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents: 6
diff changeset
11
543
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
12 if (fstat(fd, &st) < 0)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 return MAP_FAILED;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
20643
6428c91a9548 lib: Avoid compiler warning if off_t has the same size as ssize_t.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19750
diff changeset
15 #if OFF_T_MAX > SSIZE_T_MAX
543
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
16 if (st.st_size > SSIZE_T_MAX) {
43
526284657da7 Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents: 6
diff changeset
17 /* too large file to map into memory */
526284657da7 Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents: 6
diff changeset
18 errno = EFBIG;
526284657da7 Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents: 6
diff changeset
19 return MAP_FAILED;
526284657da7 Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents: 6
diff changeset
20 }
20643
6428c91a9548 lib: Avoid compiler warning if off_t has the same size as ssize_t.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19750
diff changeset
21 #endif
43
526284657da7 Fail if we try to mmap() files larger than 2G fully to memory
Timo Sirainen <tss@iki.fi>
parents: 6
diff changeset
22
543
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
23 *length = (size_t)st.st_size;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 if (*length == 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
183
4a7ab9e94f25 size_t fixes for lib/. Changed OFF_T_FORMAT to PRIuOFF_T which is more
Timo Sirainen <tss@iki.fi>
parents: 43
diff changeset
27 i_assert(*length > 0 && *length < SSIZE_T_MAX);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28
543
52fd3d82e59a Removed mmap_aligned() which isn't used anywhere. Added mmap_file() which
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
29 return mmap(NULL, *length, prot, MAP_SHARED, fd, 0);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 void *mmap_ro_file(int fd, size_t *length)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 return mmap_file(fd, length, PROT_READ);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 void *mmap_rw_file(int fd, size_t *length)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 return mmap_file(fd, length, PROT_READ | PROT_WRITE);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
19750
ac29347cf81e lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
42 #undef madvise
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 2998
diff changeset
43 int my_madvise(void *start ATTR_UNUSED, size_t length ATTR_UNUSED,
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 2998
diff changeset
44 int advice ATTR_UNUSED)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 {
19750
ac29347cf81e lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
46 #ifdef HAVE_MADVISE
ac29347cf81e lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
47 /* Ignore ENOSYS errors, which happen if the kernel hasn't implemented
ac29347cf81e lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
48 the syscall even if libc has. */
ac29347cf81e lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
49 if (madvise(start, length, advice) < 0 && errno != ENOSYS)
ac29347cf81e lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
50 return -1;
ac29347cf81e lib: Ignore ENOSYS errors from madvise() calls.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
51 #endif
2998
7e1fdbdaf465 my_madvise() wasn't returning anything.
Timo Sirainen <tss@iki.fi>
parents: 2439
diff changeset
52 return 0;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 }
2439
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
54
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
55 size_t mmap_get_page_size(void)
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
56 {
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
57 static size_t size = 0;
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
58
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
59 if (size != 0)
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
60 return size;
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
61 size = getpagesize();
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
62 return size;
7d6ca38c8c37 Added mmap_get_page_size() call which basically returns getpagesize() but
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
63 }