src/os/unix/ngx_darwin_init.c - nginx source code

Global variables defined

Data types defined

Functions defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>


  7. char     ngx_darwin_kern_ostype[16];
  8. char     ngx_darwin_kern_osrelease[128];
  9. int      ngx_darwin_hw_ncpu;
  10. int      ngx_darwin_kern_ipc_somaxconn;
  11. u_long   ngx_darwin_net_inet_tcp_sendspace;
  12. int64_t  ngx_darwin_hw_cachelinesize;

  13. ngx_uint_t  ngx_debug_malloc;


  14. static ngx_os_io_t ngx_darwin_io = {
  15.     ngx_unix_recv,
  16.     ngx_readv_chain,
  17.     ngx_udp_unix_recv,
  18.     ngx_unix_send,
  19.     ngx_udp_unix_send,
  20.     ngx_udp_unix_sendmsg_chain,
  21. #if (NGX_HAVE_SENDFILE)
  22.     ngx_darwin_sendfile_chain,
  23.     NGX_IO_SENDFILE
  24. #else
  25.     ngx_writev_chain,
  26.     0
  27. #endif
  28. };


  29. typedef struct {
  30.     char        *name;
  31.     void        *value;
  32.     size_t       size;
  33.     ngx_uint_t   exists;
  34. } sysctl_t;


  35. sysctl_t sysctls[] = {
  36.     { "hw.ncpu",
  37.       &ngx_darwin_hw_ncpu,
  38.       sizeof(ngx_darwin_hw_ncpu), 0 },

  39.     { "net.inet.tcp.sendspace",
  40.       &ngx_darwin_net_inet_tcp_sendspace,
  41.       sizeof(ngx_darwin_net_inet_tcp_sendspace), 0 },

  42.     { "kern.ipc.somaxconn",
  43.       &ngx_darwin_kern_ipc_somaxconn,
  44.       sizeof(ngx_darwin_kern_ipc_somaxconn), 0 },

  45.     { "hw.cachelinesize",
  46.       &ngx_darwin_hw_cachelinesize,
  47.       sizeof(ngx_darwin_hw_cachelinesize), 0 },

  48.     { NULL, NULL, 0, 0 }
  49. };


  50. void
  51. ngx_debug_init(void)
  52. {
  53. #if (NGX_DEBUG_MALLOC)

  54.     /*
  55.      * MacOSX 10.6, 10.7:  MallocScribble fills freed memory with 0x55
  56.      *                     and fills allocated memory with 0xAA.
  57.      * MacOSX 10.4, 10.5:  MallocScribble fills freed memory with 0x55,
  58.      *                     MallocPreScribble fills allocated memory with 0xAA.
  59.      * MacOSX 10.3:        MallocScribble fills freed memory with 0x55,
  60.      *                     and no way to fill allocated memory.
  61.      */

  62.     setenv("MallocScribble", "1", 0);

  63.     ngx_debug_malloc = 1;

  64. #else

  65.     if (getenv("MallocScribble")) {
  66.         ngx_debug_malloc = 1;
  67.     }

  68. #endif
  69. }


  70. ngx_int_t
  71. ngx_os_specific_init(ngx_log_t *log)
  72. {
  73.     size_t      size;
  74.     ngx_err_t   err;
  75.     ngx_uint_t  i;

  76.     size = sizeof(ngx_darwin_kern_ostype);
  77.     if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0)
  78.         == -1)
  79.     {
  80.         err = ngx_errno;

  81.         if (err != NGX_ENOENT) {

  82.             ngx_log_error(NGX_LOG_ALERT, log, err,
  83.                           "sysctlbyname(kern.ostype) failed");

  84.             if (err != NGX_ENOMEM) {
  85.                 return NGX_ERROR;
  86.             }

  87.             ngx_darwin_kern_ostype[size - 1] = '\0';
  88.         }
  89.     }

  90.     size = sizeof(ngx_darwin_kern_osrelease);
  91.     if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size,
  92.                      NULL, 0)
  93.         == -1)
  94.     {
  95.         err = ngx_errno;

  96.         if (err != NGX_ENOENT) {

  97.             ngx_log_error(NGX_LOG_ALERT, log, err,
  98.                           "sysctlbyname(kern.osrelease) failed");

  99.             if (err != NGX_ENOMEM) {
  100.                 return NGX_ERROR;
  101.             }

  102.             ngx_darwin_kern_osrelease[size - 1] = '\0';
  103.         }
  104.     }

  105.     for (i = 0; sysctls[i].name; i++) {
  106.         size = sysctls[i].size;

  107.         if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
  108.             == 0)
  109.         {
  110.             sysctls[i].exists = 1;
  111.             continue;
  112.         }

  113.         err = ngx_errno;

  114.         if (err == NGX_ENOENT) {
  115.             continue;
  116.         }

  117.         ngx_log_error(NGX_LOG_ALERT, log, err,
  118.                       "sysctlbyname(%s) failed", sysctls[i].name);
  119.         return NGX_ERROR;
  120.     }

  121.     ngx_cacheline_size = ngx_darwin_hw_cachelinesize;
  122.     ngx_ncpu = ngx_darwin_hw_ncpu;

  123.     if (ngx_darwin_kern_ipc_somaxconn > 32767) {
  124.         ngx_log_error(NGX_LOG_ALERT, log, 0,
  125.                       "sysctl kern.ipc.somaxconn must be less than 32768");
  126.         return NGX_ERROR;
  127.     }

  128.     ngx_tcp_nodelay_and_tcp_nopush = 1;

  129.     ngx_os_io = ngx_darwin_io;

  130.     return NGX_OK;
  131. }


  132. void
  133. ngx_os_specific_status(ngx_log_t *log)
  134. {
  135.     u_long      value;
  136.     ngx_uint_t  i;

  137.     if (ngx_darwin_kern_ostype[0]) {
  138.         ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
  139.                       ngx_darwin_kern_ostype, ngx_darwin_kern_osrelease);
  140.     }

  141.     for (i = 0; sysctls[i].name; i++) {
  142.         if (sysctls[i].exists) {
  143.             if (sysctls[i].size == sizeof(long)) {
  144.                 value = *(long *) sysctls[i].value;

  145.             } else {
  146.                 value = *(int *) sysctls[i].value;
  147.             }

  148.             ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",
  149.                           sysctls[i].name, value);
  150.         }
  151.     }
  152. }