Annotation of embedaddon/nginx/src/os/unix/ngx_freebsd_init.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * Copyright (C) Igor Sysoev
! 4: * Copyright (C) Nginx, Inc.
! 5: */
! 6:
! 7:
! 8: #include <ngx_config.h>
! 9: #include <ngx_core.h>
! 10:
! 11:
! 12: /* FreeBSD 3.0 at least */
! 13: char ngx_freebsd_kern_ostype[16];
! 14: char ngx_freebsd_kern_osrelease[128];
! 15: int ngx_freebsd_kern_osreldate;
! 16: int ngx_freebsd_hw_ncpu;
! 17: int ngx_freebsd_kern_ipc_somaxconn;
! 18: u_long ngx_freebsd_net_inet_tcp_sendspace;
! 19:
! 20: /* FreeBSD 4.9 */
! 21: int ngx_freebsd_machdep_hlt_logical_cpus;
! 22:
! 23:
! 24: ngx_uint_t ngx_freebsd_sendfile_nbytes_bug;
! 25: ngx_uint_t ngx_freebsd_use_tcp_nopush;
! 26:
! 27: ngx_uint_t ngx_debug_malloc;
! 28:
! 29:
! 30: static ngx_os_io_t ngx_freebsd_io = {
! 31: ngx_unix_recv,
! 32: ngx_readv_chain,
! 33: ngx_udp_unix_recv,
! 34: ngx_unix_send,
! 35: #if (NGX_HAVE_SENDFILE)
! 36: ngx_freebsd_sendfile_chain,
! 37: NGX_IO_SENDFILE
! 38: #else
! 39: ngx_writev_chain,
! 40: 0
! 41: #endif
! 42: };
! 43:
! 44:
! 45: typedef struct {
! 46: char *name;
! 47: void *value;
! 48: size_t size;
! 49: ngx_uint_t exists;
! 50: } sysctl_t;
! 51:
! 52:
! 53: sysctl_t sysctls[] = {
! 54: { "hw.ncpu",
! 55: &ngx_freebsd_hw_ncpu,
! 56: sizeof(ngx_freebsd_hw_ncpu), 0 },
! 57:
! 58: { "machdep.hlt_logical_cpus",
! 59: &ngx_freebsd_machdep_hlt_logical_cpus,
! 60: sizeof(ngx_freebsd_machdep_hlt_logical_cpus), 0 },
! 61:
! 62: { "net.inet.tcp.sendspace",
! 63: &ngx_freebsd_net_inet_tcp_sendspace,
! 64: sizeof(ngx_freebsd_net_inet_tcp_sendspace), 0 },
! 65:
! 66: { "kern.ipc.somaxconn",
! 67: &ngx_freebsd_kern_ipc_somaxconn,
! 68: sizeof(ngx_freebsd_kern_ipc_somaxconn), 0 },
! 69:
! 70: { NULL, NULL, 0, 0 }
! 71: };
! 72:
! 73:
! 74: void
! 75: ngx_debug_init()
! 76: {
! 77: #if (NGX_DEBUG_MALLOC)
! 78:
! 79: #if __FreeBSD_version >= 500014 && __FreeBSD_version < 1000011
! 80: _malloc_options = "J";
! 81: #elif __FreeBSD_version < 500014
! 82: malloc_options = "J";
! 83: #endif
! 84:
! 85: ngx_debug_malloc = 1;
! 86:
! 87: #else
! 88: char *mo;
! 89:
! 90: mo = getenv("MALLOC_OPTIONS");
! 91:
! 92: if (mo && ngx_strchr(mo, 'J')) {
! 93: ngx_debug_malloc = 1;
! 94: }
! 95: #endif
! 96: }
! 97:
! 98:
! 99: ngx_int_t
! 100: ngx_os_specific_init(ngx_log_t *log)
! 101: {
! 102: int version;
! 103: size_t size;
! 104: ngx_err_t err;
! 105: ngx_uint_t i;
! 106:
! 107: size = sizeof(ngx_freebsd_kern_ostype);
! 108: if (sysctlbyname("kern.ostype",
! 109: ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) {
! 110: ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
! 111: "sysctlbyname(kern.ostype) failed");
! 112:
! 113: if (ngx_errno != NGX_ENOMEM) {
! 114: return NGX_ERROR;
! 115: }
! 116:
! 117: ngx_freebsd_kern_ostype[size - 1] = '\0';
! 118: }
! 119:
! 120: size = sizeof(ngx_freebsd_kern_osrelease);
! 121: if (sysctlbyname("kern.osrelease",
! 122: ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) {
! 123: ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
! 124: "sysctlbyname(kern.osrelease) failed");
! 125:
! 126: if (ngx_errno != NGX_ENOMEM) {
! 127: return NGX_ERROR;
! 128: }
! 129:
! 130: ngx_freebsd_kern_osrelease[size - 1] = '\0';
! 131: }
! 132:
! 133:
! 134: size = sizeof(int);
! 135: if (sysctlbyname("kern.osreldate",
! 136: &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) {
! 137: ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
! 138: "sysctlbyname(kern.osreldate) failed");
! 139: return NGX_ERROR;
! 140: }
! 141:
! 142: version = ngx_freebsd_kern_osreldate;
! 143:
! 144:
! 145: #if (NGX_HAVE_SENDFILE)
! 146:
! 147: /*
! 148: * The determination of the sendfile() "nbytes bug" is complex enough.
! 149: * There are two sendfile() syscalls: a new #393 has no bug while
! 150: * an old #336 has the bug in some versions and has not in others.
! 151: * Besides libc_r wrapper also emulates the bug in some versions.
! 152: * There is no way to say exactly if syscall #336 in FreeBSD circa 4.6
! 153: * has the bug. We use the algorithm that is correct at least for
! 154: * RELEASEs and for syscalls only (not libc_r wrapper).
! 155: *
! 156: * 4.6.1-RELEASE and below have the bug
! 157: * 4.6.2-RELEASE and above have the new syscall
! 158: *
! 159: * We detect the new sendfile() syscall available at the compile time
! 160: * to allow an old binary to run correctly on an updated FreeBSD system.
! 161: */
! 162:
! 163: #if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \
! 164: || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039
! 165:
! 166: /* a new syscall without the bug */
! 167:
! 168: ngx_freebsd_sendfile_nbytes_bug = 0;
! 169:
! 170: #else
! 171:
! 172: /* an old syscall that may have the bug */
! 173:
! 174: ngx_freebsd_sendfile_nbytes_bug = 1;
! 175:
! 176: #endif
! 177:
! 178: #endif /* NGX_HAVE_SENDFILE */
! 179:
! 180:
! 181: if ((version < 500000 && version >= 440003) || version >= 500017) {
! 182: ngx_freebsd_use_tcp_nopush = 1;
! 183: }
! 184:
! 185:
! 186: for (i = 0; sysctls[i].name; i++) {
! 187: size = sysctls[i].size;
! 188:
! 189: if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
! 190: == 0)
! 191: {
! 192: sysctls[i].exists = 1;
! 193: continue;
! 194: }
! 195:
! 196: err = ngx_errno;
! 197:
! 198: if (err == NGX_ENOENT) {
! 199: continue;
! 200: }
! 201:
! 202: ngx_log_error(NGX_LOG_ALERT, log, err,
! 203: "sysctlbyname(%s) failed", sysctls[i].name);
! 204: return NGX_ERROR;
! 205: }
! 206:
! 207: if (ngx_freebsd_machdep_hlt_logical_cpus) {
! 208: ngx_ncpu = ngx_freebsd_hw_ncpu / 2;
! 209:
! 210: } else {
! 211: ngx_ncpu = ngx_freebsd_hw_ncpu;
! 212: }
! 213:
! 214: if (version < 600008 && ngx_freebsd_kern_ipc_somaxconn > 32767) {
! 215: ngx_log_error(NGX_LOG_ALERT, log, 0,
! 216: "sysctl kern.ipc.somaxconn must be less than 32768");
! 217: return NGX_ERROR;
! 218: }
! 219:
! 220: ngx_tcp_nodelay_and_tcp_nopush = 1;
! 221:
! 222: ngx_os_io = ngx_freebsd_io;
! 223:
! 224: return NGX_OK;
! 225: }
! 226:
! 227:
! 228: void
! 229: ngx_os_specific_status(ngx_log_t *log)
! 230: {
! 231: u_long value;
! 232: ngx_uint_t i;
! 233:
! 234: ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
! 235: ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease);
! 236:
! 237: #ifdef __DragonFly_version
! 238: ngx_log_error(NGX_LOG_NOTICE, log, 0,
! 239: "kern.osreldate: %d, built on %d",
! 240: ngx_freebsd_kern_osreldate, __DragonFly_version);
! 241: #else
! 242: ngx_log_error(NGX_LOG_NOTICE, log, 0,
! 243: "kern.osreldate: %d, built on %d",
! 244: ngx_freebsd_kern_osreldate, __FreeBSD_version);
! 245: #endif
! 246:
! 247: for (i = 0; sysctls[i].name; i++) {
! 248: if (sysctls[i].exists) {
! 249: if (sysctls[i].size == sizeof(long)) {
! 250: value = *(long *) sysctls[i].value;
! 251:
! 252: } else {
! 253: value = *(int *) sysctls[i].value;
! 254: }
! 255:
! 256: ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",
! 257: sysctls[i].name, value);
! 258: }
! 259: }
! 260: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>