src/os/unix/ngx_darwin_init.c - nginx-1.7.10

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. ngx_uint_t  ngx_debug_malloc;


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


  26. typedef struct {
  27.     char        *name;
  28.     void        *value;
  29.     size_t       size;
  30.     ngx_uint_t   exists;
  31. } sysctl_t;


  32. sysctl_t sysctls[] = {
  33.     { "hw.ncpu",
  34.       &ngx_darwin_hw_ncpu,
  35.       sizeof(ngx_darwin_hw_ncpu), 0 },

  36.     { "net.inet.tcp.sendspace",
  37.       &ngx_darwin_net_inet_tcp_sendspace,
  38.       sizeof(ngx_darwin_net_inet_tcp_sendspace), 0 },

  39.     { "kern.ipc.somaxconn",
  40.       &ngx_darwin_kern_ipc_somaxconn,
  41.       sizeof(ngx_darwin_kern_ipc_somaxconn), 0 },

  42.     { NULL, NULL, 0, 0 }
  43. };


  44. void
  45. ngx_debug_init(void)
  46. {
  47. #if (NGX_DEBUG_MALLOC)

  48.     /*
  49.      * MacOSX 10.6, 10.7:  MallocScribble fills freed memory with 0x55
  50.      *                     and fills allocated memory with 0xAA.
  51.      * MacOSX 10.4, 10.5:  MallocScribble fills freed memory with 0x55,
  52.      *                     MallocPreScribble fills allocated memory with 0xAA.
  53.      * MacOSX 10.3:        MallocScribble fills freed memory with 0x55,
  54.      *                     and no way to fill allocated memory.
  55.      */

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

  57.     ngx_debug_malloc = 1;

  58. #else

  59.     if (getenv("MallocScribble")) {
  60.         ngx_debug_malloc = 1;
  61.     }

  62. #endif
  63. }


  64. ngx_int_t
  65. ngx_os_specific_init(ngx_log_t *log)
  66. {
  67.     size_t      size;
  68.     ngx_err_t   err;
  69.     ngx_uint_t  i;

  70.     size = sizeof(ngx_darwin_kern_ostype);
  71.     if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0)
  72.         == -1)
  73.     {
  74.         err = ngx_errno;

  75.         if (err != NGX_ENOENT) {

  76.             ngx_log_error(NGX_LOG_ALERT, log, err,
  77.                           "sysctlbyname(kern.ostype) failed");

  78.             if (err != NGX_ENOMEM) {
  79.                 return NGX_ERROR;
  80.             }

  81.             ngx_darwin_kern_ostype[size - 1] = '\0';
  82.         }
  83.     }

  84.     size = sizeof(ngx_darwin_kern_osrelease);
  85.     if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size,
  86.                      NULL, 0)
  87.         == -1)
  88.     {
  89.         err = ngx_errno;

  90.         if (err != NGX_ENOENT) {

  91.             ngx_log_error(NGX_LOG_ALERT, log, err,
  92.                           "sysctlbyname(kern.osrelease) failed");

  93.             if (err != NGX_ENOMEM) {
  94.                 return NGX_ERROR;
  95.             }

  96.             ngx_darwin_kern_osrelease[size - 1] = '\0';
  97.         }
  98.     }

  99.     for (i = 0; sysctls[i].name; i++) {
  100.         size = sysctls[i].size;

  101.         if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
  102.             == 0)
  103.         {
  104.             sysctls[i].exists = 1;
  105.             continue;
  106.         }

  107.         err = ngx_errno;

  108.         if (err == NGX_ENOENT) {
  109.             continue;
  110.         }

  111.         ngx_log_error(NGX_LOG_ALERT, log, err,
  112.                       "sysctlbyname(%s) failed", sysctls[i].name);
  113.         return NGX_ERROR;
  114.     }

  115.     ngx_ncpu = ngx_darwin_hw_ncpu;

  116.     if (ngx_darwin_kern_ipc_somaxconn > 32767) {
  117.         ngx_log_error(NGX_LOG_ALERT, log, 0,
  118.                       "sysctl kern.ipc.somaxconn must be less than 32768");
  119.         return NGX_ERROR;
  120.     }

  121.     ngx_tcp_nodelay_and_tcp_nopush = 1;

  122.     ngx_os_io = ngx_darwin_io;

  123.     return NGX_OK;
  124. }


  125. void
  126. ngx_os_specific_status(ngx_log_t *log)
  127. {
  128.     u_long      value;
  129.     ngx_uint_t  i;

  130.     if (ngx_darwin_kern_ostype[0]) {
  131.         ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
  132.                       ngx_darwin_kern_ostype, ngx_darwin_kern_osrelease);
  133.     }

  134.     for (i = 0; sysctls[i].name; i++) {
  135.         if (sysctls[i].exists) {
  136.             if (sysctls[i].size == sizeof(long)) {
  137.                 value = *(long *) sysctls[i].value;

  138.             } else {
  139.                 value = *(int *) sysctls[i].value;
  140.             }

  141.             ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",
  142.                           sysctls[i].name, value);
  143.         }
  144.     }
  145. }