Mercurial > hg > nginx
comparison src/event/ngx_event_posted.c @ 370:54f76b0b8dca
nginx-0.0.7-2004-06-27-22:01:57 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 27 Jun 2004 18:01:57 +0000 |
parents | 7b96b7f8a6af |
children | 780e93985b93 |
comparison
equal
deleted
inserted
replaced
369:9c2515d70489 | 370:54f76b0b8dca |
---|---|
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 #include <ngx_event.h> | 4 #include <ngx_event.h> |
5 | 5 |
6 | 6 |
7 ngx_thread_volatile ngx_event_t *ngx_posted_events; | 7 ngx_thread_volatile ngx_event_t *ngx_posted_events; |
8 | |
8 #if (NGX_THREADS) | 9 #if (NGX_THREADS) |
9 ngx_mutex_t *ngx_posted_events_mutex; | 10 ngx_mutex_t *ngx_posted_events_mutex; |
11 ngx_cv_t *ngx_posted_events_cv; | |
10 #endif | 12 #endif |
11 | 13 |
12 | 14 |
13 void ngx_event_process_posted(ngx_cycle_t *cycle) | 15 void ngx_event_process_posted(ngx_cycle_t *cycle) |
14 { | 16 { |
53 } | 55 } |
54 | 56 |
55 | 57 |
56 #if (NGX_THREADS) | 58 #if (NGX_THREADS) |
57 | 59 |
58 void ngx_event_thread_handler(ngx_event_t *ev) | 60 ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle) |
59 { | 61 { |
60 if ((!ev->posted && !ev->active) | 62 ngx_event_t *ev, **ep; |
61 || (ev->use_instance && ev->instance != ev->returned_instance)) | |
62 { | |
63 /* | |
64 * the stale event from a file descriptor | |
65 * that was just closed in this iteration | |
66 */ | |
67 | 63 |
68 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 64 for ( ;; ) { |
69 "kevent: stale event " PTR_FMT, ev); | 65 |
70 return; | 66 ev = (ngx_event_t *) ngx_posted_events; |
67 ep = (ngx_event_t **) &ngx_posted_events; | |
68 | |
69 for ( ;; ) { | |
70 | |
71 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
72 "posted event " PTR_FMT, ev); | |
73 | |
74 if (ev == NULL) { | |
75 ngx_mutex_unlock(ngx_posted_events_mutex); | |
76 return NGX_OK; | |
77 } | |
78 | |
79 if (ngx_trylock(ev->lock) == NGX_BUSY) { | |
80 | |
81 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
82 "posted event " PTR_FMT " is busy", ev); | |
83 | |
84 ep = &ev->next; | |
85 ev = ev->next; | |
86 continue; | |
87 } | |
88 | |
89 *ep = ev->next; | |
90 | |
91 if ((!ev->posted && !ev->active) | |
92 || (ev->use_instance && ev->instance != ev->returned_instance)) | |
93 { | |
94 /* | |
95 * the stale event from a file descriptor | |
96 * that was just closed in this iteration | |
97 */ | |
98 | |
99 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
100 "kevent: stale event " PTR_FMT, ev); | |
101 | |
102 ev = ev->next; | |
103 | |
104 continue; | |
105 } | |
106 | |
107 ngx_mutex_unlock(ngx_posted_events_mutex); | |
108 | |
109 if (ev->posted) { | |
110 ev->posted = 0; | |
111 } | |
112 | |
113 ev->event_handler(ev); | |
114 | |
115 *(ev->lock) = 0; | |
116 | |
117 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | |
118 return NGX_ERROR; | |
119 } | |
120 | |
121 break; | |
122 } | |
71 } | 123 } |
72 | |
73 if (ev->posted) { | |
74 ev->posted = 0; | |
75 } | |
76 | |
77 ev->event_handler(ev); | |
78 } | 124 } |
79 | 125 |
80 #endif | 126 #endif |