Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/cddl/zfs/bin/mmapwrite.c
39536 views
1
/*
2
* CDDL HEADER START
3
*
4
* The contents of this file are subject to the terms of the
5
* Common Development and Distribution License (the "License").
6
* You may not use this file except in compliance with the License.
7
*
8
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9
* or http://www.opensolaris.org/os/licensing.
10
* See the License for the specific language governing permissions
11
* and limitations under the License.
12
*
13
* When distributing Covered Code, include this CDDL HEADER in each
14
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15
* If applicable, add the following below this CDDL HEADER, with the
16
* fields enclosed by brackets "[]" replaced with your own identifying
17
* information: Portions Copyright [yyyy] [name of copyright owner]
18
*
19
* CDDL HEADER END
20
*/
21
22
/*
23
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24
* Use is subject to license terms.
25
*/
26
27
28
#include <unistd.h>
29
#include <fcntl.h>
30
#include <stdio.h>
31
#include <stdlib.h>
32
#include <sys/mman.h>
33
#include <pthread.h>
34
35
/*
36
* --------------------------------------------------------------------
37
* Bug Id: 5032643
38
*
39
* Simply writing to a file and mmaping that file at the same time can
40
* result in deadlock. Nothing perverse like writing from the file's
41
* own mapping is required.
42
* --------------------------------------------------------------------
43
*/
44
45
static void *
46
mapper(void *fdp)
47
{
48
void *addr;
49
int fd = *(int *)fdp;
50
51
if ((addr =
52
mmap(0, 8192, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
53
perror("mmap");
54
exit(1);
55
}
56
for (;;) {
57
if (mmap(addr, 8192, PROT_READ,
58
MAP_SHARED|MAP_FIXED, fd, 0) == MAP_FAILED) {
59
perror("mmap");
60
exit(1);
61
}
62
}
63
/* NOTREACHED */
64
return ((void *)1);
65
}
66
67
int
68
main(int argc, char **argv)
69
{
70
int fd;
71
char buf[BUFSIZ];
72
pthread_t pt;
73
74
if (argc != 2) {
75
(void) printf("usage: %s <file name>\n", argv[0]);
76
exit(1);
77
}
78
79
if ((fd = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) {
80
perror("open");
81
exit(1);
82
}
83
84
if (pthread_create(&pt, NULL, mapper, &fd) != 0) {
85
perror("pthread_create");
86
exit(1);
87
}
88
for (;;) {
89
if (write(fd, buf, sizeof (buf)) == -1) {
90
perror("write");
91
exit(1);
92
}
93
}
94
95
/* NOTREACHED */
96
return (0);
97
}
98
99