annotate src/os/unix/ngx_freebsd_init.c @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents 9121a0a91f47
children fd759445d8a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 /* FreeBSD 3.0 at least */
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
12 char ngx_freebsd_kern_ostype[16];
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
13 char ngx_freebsd_kern_osrelease[128];
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
14 int ngx_freebsd_kern_osreldate;
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
15 int ngx_freebsd_hw_ncpu;
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
16 int ngx_freebsd_kern_ipc_somaxconn;
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
17 u_long ngx_freebsd_net_inet_tcp_sendspace;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 /* FreeBSD 4.9 */
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
20 int ngx_freebsd_machdep_hlt_logical_cpus;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 /* FreeBSD 5.0 */
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
23 int ngx_freebsd_kern_ipc_zero_copy_send;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25
358
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
26 ngx_uint_t ngx_freebsd_sendfile_nbytes_bug;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
27 ngx_uint_t ngx_freebsd_use_tcp_nopush;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
28 ngx_uint_t ngx_freebsd_debug_malloc;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
31 static ngx_os_io_t ngx_freebsd_io = {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 ngx_unix_recv,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 ngx_readv_chain,
354
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 222
diff changeset
34 ngx_udp_unix_recv,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 ngx_unix_send,
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
36 #if (NGX_HAVE_SENDFILE)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 ngx_freebsd_sendfile_chain,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 NGX_IO_SENDFILE
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 #else
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 ngx_writev_chain,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 };
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 typedef struct {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 char *name;
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
48 void *value;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 size_t size;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 ngx_uint_t exists;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 } sysctl_t;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 sysctl_t sysctls[] = {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 { "hw.ncpu",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 &ngx_freebsd_hw_ncpu,
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
57 sizeof(ngx_freebsd_hw_ncpu), 0 },
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 { "machdep.hlt_logical_cpus",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 &ngx_freebsd_machdep_hlt_logical_cpus,
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
61 sizeof(ngx_freebsd_machdep_hlt_logical_cpus), 0 },
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 { "net.inet.tcp.sendspace",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 &ngx_freebsd_net_inet_tcp_sendspace,
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
65 sizeof(ngx_freebsd_net_inet_tcp_sendspace), 0 },
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
67 { "kern.ipc.somaxconn",
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
68 &ngx_freebsd_kern_ipc_somaxconn,
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
69 sizeof(ngx_freebsd_kern_ipc_somaxconn), 0 },
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
70
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 { "kern.ipc.zero_copy.send",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 &ngx_freebsd_kern_ipc_zero_copy_send,
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
73 sizeof(ngx_freebsd_kern_ipc_zero_copy_send), 0 },
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 { NULL, NULL, 0, 0 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 };
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
79 void
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
80 ngx_debug_init()
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 {
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 88
diff changeset
82 #if (NGX_DEBUG_MALLOC)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 #if __FreeBSD_version >= 500014
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 _malloc_options = "J";
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86 #else
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 malloc_options = "J";
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89
358
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
90 ngx_freebsd_debug_malloc = 1;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
91
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
92 #else
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
93 char *mo;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
94
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
95 mo = getenv("MALLOC_OPTIONS");
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
96
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
97 if (mo && ngx_strchr(mo, 'J')) {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
98 ngx_freebsd_debug_malloc = 1;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
99 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
104 ngx_int_t
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
105 ngx_os_specific_init(ngx_log_t *log)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
107 int version, somaxconn;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 size_t size;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 ngx_err_t err;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 ngx_uint_t i;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 size = sizeof(ngx_freebsd_kern_ostype);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 if (sysctlbyname("kern.ostype",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 "sysctlbyname(kern.ostype) failed");
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
117
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
118 if (ngx_errno != NGX_ENOMEM) {
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
119 return NGX_ERROR;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
120 }
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
121
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
122 ngx_freebsd_kern_ostype[size - 1] = '\0';
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 size = sizeof(ngx_freebsd_kern_osrelease);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 if (sysctlbyname("kern.osrelease",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 "sysctlbyname(kern.osrelease) failed");
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
130
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
131 if (ngx_errno != NGX_ENOMEM) {
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
132 return NGX_ERROR;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
133 }
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
134
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
135 ngx_freebsd_kern_osrelease[size - 1] = '\0';
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 size = sizeof(int);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 if (sysctlbyname("kern.osreldate",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143 "sysctlbyname(kern.osreldate) failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 version = ngx_freebsd_kern_osreldate;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
150 #if (NGX_HAVE_SENDFILE)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 * The determination of the sendfile() "nbytes bug" is complex enough.
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154 * There are two sendfile() syscalls: a new #393 has no bug while
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 * an old #336 has the bug in some versions and has not in others.
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 * Besides libc_r wrapper also emulates the bug in some versions.
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 * There is no way to say exactly if syscall #336 in FreeBSD circa 4.6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 * has the bug. We use the algorithm that is correct at least for
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 * RELEASEs and for syscalls only (not libc_r wrapper).
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 *
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 * 4.6.1-RELEASE and below have the bug
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162 * 4.6.2-RELEASE and above have the new syscall
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 *
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 * We detect the new sendfile() syscall available at the compile time
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165 * to allow an old binary to run correctly on an updated FreeBSD system.
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 #if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 /* a new syscall without the bug */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 ngx_freebsd_sendfile_nbytes_bug = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 #else
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 /* an old syscall that may have the bug */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 ngx_freebsd_sendfile_nbytes_bug = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
183 #endif /* NGX_HAVE_SENDFILE */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 if ((version < 500000 && version >= 440003) || version >= 500017) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 ngx_freebsd_use_tcp_nopush = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 for (i = 0; sysctls[i].name; i++) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 size = sysctls[i].size;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
195 == 0)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 sysctls[i].exists = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 continue;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 err = ngx_errno;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203 if (err == NGX_ENOENT) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 continue;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 ngx_log_error(NGX_LOG_ALERT, log, err,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 "sysctlbyname(%s) failed", sysctls[i].name);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 if (ngx_freebsd_machdep_hlt_logical_cpus) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213 ngx_ncpu = ngx_freebsd_hw_ncpu / 2;
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
214
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 ngx_ncpu = ngx_freebsd_hw_ncpu;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
219 somaxconn = version < 600008 ? 32676 : 65535;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
220
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
221 if (ngx_freebsd_kern_ipc_somaxconn > somaxconn) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
222 ngx_log_error(NGX_LOG_ALERT, log, 0,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
223 "sysctl kern.ipc.somaxconn must be no more than %d",
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
224 somaxconn);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
225 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
226 }
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
227
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
228 ngx_tcp_nodelay_and_tcp_nopush = 1;
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
229
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
230 ngx_os_io = ngx_freebsd_io;
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
231
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
232 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
236 void
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
237 ngx_os_specific_status(ngx_log_t *log)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 {
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
239 u_long value;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 ngx_uint_t i;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
242 ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 #ifdef __DragonFly_version
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
246 ngx_log_error(NGX_LOG_NOTICE, log, 0,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 "kern.osreldate: %d, built on %d",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 ngx_freebsd_kern_osreldate, __DragonFly_version);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 #else
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
250 ngx_log_error(NGX_LOG_NOTICE, log, 0,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 "kern.osreldate: %d, built on %d",
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 ngx_freebsd_kern_osreldate, __FreeBSD_version);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 for (i = 0; sysctls[i].name; i++) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 if (sysctls[i].exists) {
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
257 if (sysctls[i].size == sizeof(long)) {
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
258 value = *(long *) sysctls[i].value;
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
259
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
260 } else {
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
261 value = *(int *) sysctls[i].value;
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
262 }
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
263
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
264 ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
265 sysctls[i].name, value);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 }