Mercurial > hg > nginx-vendor-current
comparison src/event/ngx_event_posted.c @ 0:f0b350454894 NGINX_0_1_0
nginx 0.1.0
*) The first public version.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Oct 2004 00:00:00 +0400 |
parents | |
children | 46833bd150cb |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f0b350454894 |
---|---|
1 | |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #include <ngx_config.h> | |
8 #include <ngx_core.h> | |
9 #include <ngx_event.h> | |
10 | |
11 | |
12 ngx_thread_volatile ngx_event_t *ngx_posted_events; | |
13 | |
14 #if (NGX_THREADS) | |
15 ngx_mutex_t *ngx_posted_events_mutex; | |
16 #endif | |
17 | |
18 | |
19 void ngx_event_process_posted(ngx_cycle_t *cycle) | |
20 { | |
21 ngx_event_t *ev; | |
22 | |
23 for ( ;; ) { | |
24 | |
25 ev = (ngx_event_t *) ngx_posted_events; | |
26 | |
27 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
28 "posted event " PTR_FMT, ev); | |
29 | |
30 if (ev == NULL) { | |
31 return; | |
32 } | |
33 | |
34 ngx_delete_posted_event(ev); | |
35 | |
36 ev->event_handler(ev); | |
37 } | |
38 } | |
39 | |
40 | |
41 #if (NGX_THREADS) | |
42 | |
43 void ngx_wakeup_worker_thread(ngx_cycle_t *cycle) | |
44 { | |
45 ngx_int_t i; | |
46 ngx_uint_t busy; | |
47 ngx_event_t *ev; | |
48 | |
49 #if 0 | |
50 busy = 1; | |
51 | |
52 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | |
53 return; | |
54 } | |
55 | |
56 for (ev = (ngx_event_t *) ngx_posted_events; ev; ev = ev->next) { | |
57 if (*(ev->lock) == 0) { | |
58 busy = 0; | |
59 break; | |
60 } | |
61 } | |
62 | |
63 ngx_mutex_unlock(ngx_posted_events_mutex); | |
64 | |
65 if (busy) { | |
66 return; | |
67 } | |
68 #endif | |
69 | |
70 for (i = 0; i < ngx_threads_n; i++) { | |
71 if (ngx_threads[i].state == NGX_THREAD_FREE) { | |
72 ngx_cond_signal(ngx_threads[i].cv); | |
73 return; | |
74 } | |
75 } | |
76 } | |
77 | |
78 | |
79 ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle) | |
80 { | |
81 ngx_event_t *ev; | |
82 | |
83 for ( ;; ) { | |
84 | |
85 ev = (ngx_event_t *) ngx_posted_events; | |
86 | |
87 for ( ;; ) { | |
88 | |
89 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
90 "posted event " PTR_FMT, ev); | |
91 | |
92 if (ev == NULL) { | |
93 return NGX_OK; | |
94 } | |
95 | |
96 if (ngx_trylock(ev->lock) == 0) { | |
97 | |
98 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
99 "posted event " PTR_FMT " is busy", ev); | |
100 | |
101 ev = ev->next; | |
102 continue; | |
103 } | |
104 | |
105 if (ev->lock != ev->own_lock) { | |
106 if (*(ev->own_lock)) { | |
107 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
108 "the own lock of the posted event " | |
109 PTR_FMT " is busy", ev); | |
110 ngx_unlock(ev->lock); | |
111 ev = ev->next; | |
112 continue; | |
113 } | |
114 *(ev->own_lock) = 1; | |
115 } | |
116 | |
117 ngx_delete_posted_event(ev); | |
118 | |
119 ev->locked = 1; | |
120 | |
121 ev->ready |= ev->posted_ready; | |
122 ev->timedout |= ev->posted_timedout; | |
123 ev->pending_eof |= ev->posted_eof; | |
124 #if (HAVE_KQUEUE) | |
125 ev->kq_errno |= ev->posted_errno; | |
126 #endif | |
127 if (ev->posted_available) { | |
128 ev->available = ev->posted_available; | |
129 } | |
130 | |
131 ev->posted_ready = 0; | |
132 ev->posted_timedout = 0; | |
133 ev->posted_eof = 0; | |
134 #if (HAVE_KQUEUE) | |
135 ev->posted_errno = 0; | |
136 #endif | |
137 ev->posted_available = 0; | |
138 | |
139 ngx_mutex_unlock(ngx_posted_events_mutex); | |
140 | |
141 ev->event_handler(ev); | |
142 | |
143 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | |
144 return NGX_ERROR; | |
145 } | |
146 | |
147 if (ev->locked) { | |
148 ngx_unlock(ev->lock); | |
149 | |
150 if (ev->lock != ev->own_lock) { | |
151 ngx_unlock(ev->own_lock); | |
152 } | |
153 } | |
154 | |
155 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
156 "posted event " PTR_FMT " is done", ev); | |
157 | |
158 break; | |
159 } | |
160 } | |
161 } | |
162 | |
163 #else | |
164 | |
165 void ngx_wakeup_worker_thread(ngx_cycle_t *cycle) | |
166 { | |
167 } | |
168 | |
169 #endif |