annotate src/os/unix/ngx_freebsd_rfork_thread.c @ 86:3973260705cc

nginx-0.0.1-2003-05-12-19:52:24 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 12 May 2003 15:52:24 +0000
parents 3549c2bf9eaf
children 738fe44c70d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
2 #include <ngx_config.h>
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
3 #include <ngx_core.h>
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
4 #include <ngx_process.h>
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
5 #include <ngx_log.h>
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
6 #include <ngx_alloc.h>
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
7
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
9 extern int __isthreaded;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
10
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
11
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
12 typedef int ngx_tid_t;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
13
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
14
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
15 static inline int ngx_gettid();
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
18 static char *usrstack;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
19 static int red_zone = 4096;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
20
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
21 static size_t stack_size;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
22 static size_t usable_stack_size;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
23 static char *last_stack;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
24
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
25 static int threads;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
26 static int nthreads;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
27 static ngx_tid_t *tids;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
28
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
29 /* the thread-safe errno */
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
30
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
31 static int errno0; /* the main thread's errno */
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
32 static int *errnos;
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 int *__error()
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 {
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
36 int tid;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
37
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
38 tid = ngx_gettid();
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
39
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
40 return tid ? &errnos[tid - 1] : &errno0;
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 }
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
44 int ngx_create_thread(ngx_tid_t *tid, int (*func)(void *arg), void *arg,
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
45 ngx_log_t *log)
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 {
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
47 int id, err;
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
48 char *stack, *stack_top;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
49
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
50 if (threads >= nthreads) {
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
51 ngx_log_error(NGX_LOG_CRIT, log, 0,
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
52 "no more than %d threads can be created", nthreads);
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
53 return NGX_ERROR;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
54 }
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
56 last_stack -= stack_size;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
57 stack = mmap(last_stack, usable_stack_size, PROT_READ|PROT_WRITE,
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
58 MAP_STACK, -1, 0);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
59 if (stack == MAP_FAILED) {
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
60 ngx_log_error(NGX_LOG_ALERT, log, errno,
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
61 "mmap(%08X:%d, MAP_STACK) thread stack failed",
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
62 last_stack, usable_stack_size);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
63 return NGX_ERROR;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
64 }
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
65
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
66 if (stack != last_stack) {
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
67 ngx_log_error(NGX_LOG_ALERT, log, 0, "stack address was changed");
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
68 }
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
69
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
70 stack_top = stack + usable_stack_size;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
71
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
72 printf("stack: %08X-%08X\n", stack, stack_top);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
73
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
74 #if 1
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
75 id = rfork_thread(RFPROC|RFTHREAD|RFMEM, stack_top, func, arg);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
76 #elif 1
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
77 id = rfork_thread(RFPROC|RFMEM, stack_top, func, arg);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
78 #elif 1
85
3549c2bf9eaf nginx-0.0.1-2003-05-07-21:32:45 import
Igor Sysoev <igor@sysoev.ru>
parents: 84
diff changeset
79 id = rfork_thread(RFFDG|RFCFDG, stack_top, func, arg);
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
80 #else
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
81 id = rfork(RFFDG|RFCFDG);
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
82 #endif
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
83
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
84 err = errno;
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
86 if (id == -1) {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
87 ngx_log_error(NGX_LOG_ALERT, log, err, "rfork() failed");
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
88
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
89 } else {
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 *tid = id;
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
91 threads = (usrstack - stack_top) / stack_size;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
92 tids[threads] = id;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
93
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
94 /* allow the spinlock in libc malloc() */
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
95 __isthreaded = 1;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
96 }
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 return err;
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 }
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
102 int ngx_init_thread_env(int n, size_t size, ngx_log_t *log)
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 {
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
104 int len;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
105 char *rz, *zone;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
106
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
107 nthreads = n;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
108
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
109 len = 4;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
110 if (sysctlbyname("kern.usrstack", &usrstack, &len, NULL, 0) == -1) {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
111 ngx_log_error(NGX_LOG_ALERT, log, errno,
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
112 "sysctlbyname(kern.usrstack) failed");
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
113 return NGX_ERROR;
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 }
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
116 printf("usrstack: %08X\n", usrstack);
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
117
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
118 /* red zone */
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
119 rz = usrstack - (size + red_zone);
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
121 printf("red zone: %08X\n", rz);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
122
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
123 zone = mmap(rz, red_zone, PROT_NONE, MAP_ANON, -1, 0);
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
124 if (zone == MAP_FAILED) {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
125 ngx_log_error(NGX_LOG_ALERT, log, errno,
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
126 "mmap(%08X:%d, PROT_NONE, MAP_ANON) red zone failed",
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
127 rz, red_zone);
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
128 return NGX_ERROR;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
129 }
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
130
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
131 if (zone != rz) {
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
132 ngx_log_error(NGX_LOG_ALERT, log, 0, "red zone address was changed");
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
133 }
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
134
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
135 /* create the thread errno array */
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
136 ngx_test_null(errnos, ngx_calloc(n * sizeof(int), log), NGX_ERROR);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
137
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
138 /* create the thread tid array */
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
139 ngx_test_null(tids, ngx_calloc((n + 1) * sizeof(ngx_tid_t), log),
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
140 NGX_ERROR);
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
141
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
142 tids[0] = ngx_getpid();
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
143 threads = 1;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
144
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
145 last_stack = zone + red_zone;
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
146 usable_stack_size = size;
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
147 stack_size = size + red_zone;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
148
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
149 return NGX_OK;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
150 }
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
152
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
153 ngx_tid_t ngx_thread_self()
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
154 {
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
155 int tid;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
156 ngx_tid_t pid;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
157
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
158 tid = ngx_gettid();
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
159
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
160 if (tids[tid] == 0) {
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
161 pid = ngx_getpid();
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
162 tids[tid] = pid;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
163 return pid;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
164 }
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
165
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
166 return tids[tid];
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
167 }
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
168
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
170 static inline int ngx_gettid()
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
171 {
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
172 char *sp;
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
173
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
174 if (stack_size == 0) {
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
175 return 0;
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
176 }
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
177
84
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
178 __asm__ ("mov %%esp, %0" : "=q" (sp));
fab4cb00fe5b nginx-0.0.1-2003-05-06-21:03:16 import
Igor Sysoev <igor@sysoev.ru>
parents: 3
diff changeset
179
86
3973260705cc nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 85
diff changeset
180 return (usrstack - sp) / stack_size;
3
34a521b1a148 nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 }