3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
10 #include <ngx_event.h>
13 ngx_thread_volatile ngx_event_t
*ngx_posted_accept_events
;
14 ngx_thread_volatile ngx_event_t
*ngx_posted_events
;
17 ngx_mutex_t
*ngx_posted_events_mutex
;
22 ngx_event_process_posted(ngx_cycle_t
*cycle
,
23 ngx_thread_volatile ngx_event_t
**posted
)
29 ev
= (ngx_event_t
*) *posted
;
31 ngx_log_debug1(NGX_LOG_DEBUG_EVENT
, cycle
->log
, 0,
32 "posted event %p", ev
);
38 ngx_delete_posted_event(ev
);
45 #if (NGX_THREADS) && !(NGX_WIN32)
48 ngx_wakeup_worker_thread(ngx_cycle_t
*cycle
)
57 if (ngx_mutex_lock(ngx_posted_events_mutex
) == NGX_ERROR
) {
61 for (ev
= (ngx_event_t
*) ngx_posted_events
; ev
; ev
= ev
->next
) {
62 if (*(ev
->lock
) == 0) {
68 ngx_mutex_unlock(ngx_posted_events_mutex
);
75 for (i
= 0; i
< ngx_threads_n
; i
++) {
76 if (ngx_threads
[i
].state
== NGX_THREAD_FREE
) {
77 ngx_cond_signal(ngx_threads
[i
].cv
);
85 ngx_event_thread_process_posted(ngx_cycle_t
*cycle
)
91 ev
= (ngx_event_t
*) ngx_posted_events
;
95 ngx_log_debug1(NGX_LOG_DEBUG_EVENT
, cycle
->log
, 0,
96 "posted event %p", ev
);
102 if (ngx_trylock(ev
->lock
) == 0) {
104 ngx_log_debug1(NGX_LOG_DEBUG_EVENT
, cycle
->log
, 0,
105 "posted event %p is busy", ev
);
111 if (ev
->lock
!= ev
->own_lock
) {
112 if (*(ev
->own_lock
)) {
113 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, 0,
114 "the own lock of the posted event %p is busy", ev
);
115 ngx_unlock(ev
->lock
);
122 ngx_delete_posted_event(ev
);
126 ev
->ready
|= ev
->posted_ready
;
127 ev
->timedout
|= ev
->posted_timedout
;
128 ev
->pending_eof
|= ev
->posted_eof
;
129 #if (NGX_HAVE_KQUEUE)
130 ev
->kq_errno
|= ev
->posted_errno
;
132 if (ev
->posted_available
) {
133 ev
->available
= ev
->posted_available
;
136 ev
->posted_ready
= 0;
137 ev
->posted_timedout
= 0;
139 #if (NGX_HAVE_KQUEUE)
140 ev
->posted_errno
= 0;
142 ev
->posted_available
= 0;
144 ngx_mutex_unlock(ngx_posted_events_mutex
);
148 ngx_mutex_lock(ngx_posted_events_mutex
);
151 ngx_unlock(ev
->lock
);
153 if (ev
->lock
!= ev
->own_lock
) {
154 ngx_unlock(ev
->own_lock
);
158 ngx_log_debug1(NGX_LOG_DEBUG_EVENT
, cycle
->log
, 0,
159 "posted event %p is done", ev
);
169 ngx_wakeup_worker_thread(ngx_cycle_t
*cycle
)