Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_darwin_init.c
Go to the documentation of this file.
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 
17 
19 
20 
21 static ngx_os_io_t ngx_darwin_io = {
26 #if (NGX_HAVE_SENDFILE)
29 #else
31  0
32 #endif
33 };
34 
35 
36 typedef struct {
37  char *name;
38  void *value;
39  size_t size;
41 } sysctl_t;
42 
43 
45  { "hw.ncpu",
47  sizeof(ngx_darwin_hw_ncpu), 0 },
48 
49  { "net.inet.tcp.sendspace",
52 
53  { "kern.ipc.somaxconn",
55  sizeof(ngx_darwin_kern_ipc_somaxconn), 0 },
56 
57  { NULL, NULL, 0, 0 }
58 };
59 
60 
61 void
63 {
64 #if (NGX_DEBUG_MALLOC)
65 
66  /*
67  * MacOSX 10.6, 10.7: MallocScribble fills freed memory with 0x55
68  * and fills allocated memory with 0xAA.
69  * MacOSX 10.4, 10.5: MallocScribble fills freed memory with 0x55,
70  * MallocPreScribble fills allocated memory with 0xAA.
71  * MacOSX 10.3: MallocScribble fills freed memory with 0x55,
72  * and no way to fill allocated memory.
73  */
74 
75  setenv("MallocScribble", "1", 0);
76 
77  ngx_debug_malloc = 1;
78 
79 #else
80 
81  if (getenv("MallocScribble")) {
82  ngx_debug_malloc = 1;
83  }
84 
85 #endif
86 }
87 
88 
91 {
92  size_t size;
93  ngx_err_t err;
94  ngx_uint_t i;
95 
96  size = sizeof(ngx_darwin_kern_ostype);
97  if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0)
98  == -1)
99  {
100  err = ngx_errno;
101 
102  if (err != NGX_ENOENT) {
103 
104  ngx_log_error(NGX_LOG_ALERT, log, err,
105  "sysctlbyname(kern.ostype) failed");
106 
107  if (err != NGX_ENOMEM) {
108  return NGX_ERROR;
109  }
110 
111  ngx_darwin_kern_ostype[size - 1] = '\0';
112  }
113  }
114 
115  size = sizeof(ngx_darwin_kern_osrelease);
116  if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size,
117  NULL, 0)
118  == -1)
119  {
120  err = ngx_errno;
121 
122  if (err != NGX_ENOENT) {
123 
124  ngx_log_error(NGX_LOG_ALERT, log, err,
125  "sysctlbyname(kern.osrelease) failed");
126 
127  if (err != NGX_ENOMEM) {
128  return NGX_ERROR;
129  }
130 
131  ngx_darwin_kern_osrelease[size - 1] = '\0';
132  }
133  }
134 
135  for (i = 0; sysctls[i].name; i++) {
136  size = sysctls[i].size;
137 
138  if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
139  == 0)
140  {
141  sysctls[i].exists = 1;
142  continue;
143  }
144 
145  err = ngx_errno;
146 
147  if (err == NGX_ENOENT) {
148  continue;
149  }
150 
151  ngx_log_error(NGX_LOG_ALERT, log, err,
152  "sysctlbyname(%s) failed", sysctls[i].name);
153  return NGX_ERROR;
154  }
155 
157 
158  if (ngx_darwin_kern_ipc_somaxconn > 32767) {
160  "sysctl kern.ipc.somaxconn must be less than 32768");
161  return NGX_ERROR;
162  }
163 
165 
166  ngx_os_io = ngx_darwin_io;
167 
168  return NGX_OK;
169 }
170 
171 
172 void
174 {
175  u_long value;
176  ngx_uint_t i;
177 
178  if (ngx_darwin_kern_ostype[0]) {
179  ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
181  }
182 
183  for (i = 0; sysctls[i].name; i++) {
184  if (sysctls[i].exists) {
185  if (sysctls[i].size == sizeof(long)) {
186  value = *(long *) sysctls[i].value;
187 
188  } else {
189  value = *(int *) sysctls[i].value;
190  }
191 
192  ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",
193  sysctls[i].name, value);
194  }
195  }
196 }