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>