nxt_fiber.c (6:6b3ce47b7663) nxt_fiber.c (564:762f8c976ead)
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 119 unchanged lines hidden (view full) ---

128 size_t size;
129
130 size = fib->stack_size + nxt_pagesize;
131
132 s = mmap(NULL, size, PROT_READ | PROT_WRITE,
133 MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN, -1, 0);
134
135 if (nxt_slow_path(s == MAP_FAILED)) {
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 119 unchanged lines hidden (view full) ---

128 size_t size;
129
130 size = fib->stack_size + nxt_pagesize;
131
132 s = mmap(NULL, size, PROT_READ | PROT_WRITE,
133 MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN, -1, 0);
134
135 if (nxt_slow_path(s == MAP_FAILED)) {
136 nxt_log(task, NXT_LOG_CRIT, "fiber stack "
137 "mmap(%uz, MAP_PRIVATE|MAP_ANON|MAP_GROWSDOWN) failed %E",
138 size, nxt_errno);
136 nxt_alert(task, "fiber stack "
137 "mmap(%uz, MAP_PRIVATE|MAP_ANON|MAP_GROWSDOWN) failed %E",
138 size, nxt_errno);
139
140 return NULL;
141 }
142
143 if (nxt_slow_path(mprotect(s, nxt_pagesize, PROT_NONE) != 0)) {
139
140 return NULL;
141 }
142
143 if (nxt_slow_path(mprotect(s, nxt_pagesize, PROT_NONE) != 0)) {
144 nxt_log(task, NXT_LOG_CRIT,
145 "fiber stack mprotect(%uz, PROT_NONE) failed %E",
146 size, nxt_errno);
144 nxt_alert(task, "fiber stack mprotect(%uz, PROT_NONE) failed %E",
145 size, nxt_errno);
147
148 return NULL;
149 }
150
151 s += nxt_pagesize;
152
153 nxt_debug(task, "fiber stack mmap: %p", s);
154

--- 8 unchanged lines hidden (view full) ---

163 char *s;
164 size_t size;
165
166 size = fib->stack_size + nxt_pagesize;
167
168 s = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
169
170 if (nxt_slow_path(s == MAP_FAILED)) {
146
147 return NULL;
148 }
149
150 s += nxt_pagesize;
151
152 nxt_debug(task, "fiber stack mmap: %p", s);
153

--- 8 unchanged lines hidden (view full) ---

162 char *s;
163 size_t size;
164
165 size = fib->stack_size + nxt_pagesize;
166
167 s = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
168
169 if (nxt_slow_path(s == MAP_FAILED)) {
171 nxt_log(task, NXT_LOG_CRIT,
172 "fiber stack mmap(%uz, MAP_PRIVATE|MAP_ANON) failed %E",
173 size, nxt_errno);
170 nxt_alert(task, "fiber stack mmap(%uz, MAP_PRIVATE|MAP_ANON) failed %E",
171 size, nxt_errno);
174
175 return NULL;
176 }
177
178 if (nxt_slow_path(mprotect(s, nxt_pagesize, PROT_NONE) != 0)) {
172
173 return NULL;
174 }
175
176 if (nxt_slow_path(mprotect(s, nxt_pagesize, PROT_NONE) != 0)) {
179 nxt_log(task, NXT_LOG_CRIT,
180 "fiber stack mprotect(%uz, PROT_NONE) failed %E",
181 size, nxt_errno);
177 nxt_alert(task, "fiber stack mprotect(%uz, PROT_NONE) failed %E",
178 size, nxt_errno);
182
183 return NULL;
184 }
185
186 s += nxt_pagesize;
187
188 nxt_debug(task, "fiber stack mmap: %p", s);
189

--- 17 unchanged lines hidden (view full) ---

207static void
208nxt_fiber_switch_stack(nxt_fiber_t *fib, jmp_buf *parent)
209{
210 ucontext_t uc;
211
212 nxt_debug(&fib->task, "fiber switch to stack: %p", fib->stack);
213
214 if (nxt_slow_path(getcontext(&uc) != 0)) {
179
180 return NULL;
181 }
182
183 s += nxt_pagesize;
184
185 nxt_debug(task, "fiber stack mmap: %p", s);
186

--- 17 unchanged lines hidden (view full) ---

204static void
205nxt_fiber_switch_stack(nxt_fiber_t *fib, jmp_buf *parent)
206{
207 ucontext_t uc;
208
209 nxt_debug(&fib->task, "fiber switch to stack: %p", fib->stack);
210
211 if (nxt_slow_path(getcontext(&uc) != 0)) {
215 nxt_log(&fib->task, NXT_LOG_CRIT, "getcontext() failed");
212 nxt_alert(&fib->task, "getcontext() failed");
216 return;
217 }
218
219 uc.uc_link = NULL;
220 uc.uc_stack.ss_sp = fib->stack;
221 uc.uc_stack.ss_size = fib->stack_size;
222
223 makecontext(&uc, (void (*)(void)) nxt_fiber_trampoline, 4,
224 (uint32_t) ((uintptr_t) fib >> 32),
225 (uint32_t) ((uintptr_t) fib & 0xffffffff),
226 (uint32_t) ((uintptr_t) parent >> 32),
227 (uint32_t) ((uintptr_t) parent & 0xffffffff));
228
229 setcontext(&uc);
230
213 return;
214 }
215
216 uc.uc_link = NULL;
217 uc.uc_stack.ss_sp = fib->stack;
218 uc.uc_stack.ss_size = fib->stack_size;
219
220 makecontext(&uc, (void (*)(void)) nxt_fiber_trampoline, 4,
221 (uint32_t) ((uintptr_t) fib >> 32),
222 (uint32_t) ((uintptr_t) fib & 0xffffffff),
223 (uint32_t) ((uintptr_t) parent >> 32),
224 (uint32_t) ((uintptr_t) parent & 0xffffffff));
225
226 setcontext(&uc);
227
231 nxt_log(&fib->task, NXT_LOG_CRIT, "setcontext() failed");
228 nxt_alert(&fib->task, "setcontext() failed");
232}
233
234
235static void
236nxt_fiber_trampoline(uint32_t fh, uint32_t fl, uint32_t ph, uint32_t pl)
237{
238 jmp_buf *parent;
239 nxt_task_t *task;

--- 33 unchanged lines hidden (view full) ---

273static void
274nxt_fiber_switch_stack(nxt_fiber_t *fib, jmp_buf *parent)
275{
276 ucontext_t uc;
277
278 nxt_debug(&fib->task, "fiber switch to stack: %p", fib->stack);
279
280 if (nxt_slow_path(getcontext(&uc) != 0)) {
229}
230
231
232static void
233nxt_fiber_trampoline(uint32_t fh, uint32_t fl, uint32_t ph, uint32_t pl)
234{
235 jmp_buf *parent;
236 nxt_task_t *task;

--- 33 unchanged lines hidden (view full) ---

270static void
271nxt_fiber_switch_stack(nxt_fiber_t *fib, jmp_buf *parent)
272{
273 ucontext_t uc;
274
275 nxt_debug(&fib->task, "fiber switch to stack: %p", fib->stack);
276
277 if (nxt_slow_path(getcontext(&uc) != 0)) {
281 nxt_log(&fib->task, NXT_LOG_CRIT, "getcontext() failed");
278 nxt_alert(&fib->task, "getcontext() failed");
282 return;
283 }
284
285 uc.uc_link = NULL;
286 uc.uc_stack.ss_sp = fib->stack;
287 uc.uc_stack.ss_size = fib->stack_size;
288
289 makecontext(&uc, (void (*)(void)) nxt_fiber_trampoline, 2, fib, parent);
290
291 setcontext(&uc);
292
293#if !(NXT_SOLARIS)
294 /* Solaris declares setcontext() as __NORETURN. */
295
279 return;
280 }
281
282 uc.uc_link = NULL;
283 uc.uc_stack.ss_sp = fib->stack;
284 uc.uc_stack.ss_size = fib->stack_size;
285
286 makecontext(&uc, (void (*)(void)) nxt_fiber_trampoline, 2, fib, parent);
287
288 setcontext(&uc);
289
290#if !(NXT_SOLARIS)
291 /* Solaris declares setcontext() as __NORETURN. */
292
296 nxt_log(&fib->task, NXT_LOG_CRIT, "setcontext() failed");
293 nxt_alert(&fib->task, "setcontext() failed");
297#endif
298}
299
300
301static void
302nxt_fiber_trampoline(nxt_fiber_t *fib, jmp_buf *parent)
303{
304 nxt_task_t *task;

--- 165 unchanged lines hidden ---
294#endif
295}
296
297
298static void
299nxt_fiber_trampoline(nxt_fiber_t *fib, jmp_buf *parent)
300{
301 nxt_task_t *task;

--- 165 unchanged lines hidden ---