Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_event_posted.c
Go to the documentation of this file.
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10 #include <ngx_event.h>
11 
12 
15 
16 #if (NGX_THREADS)
17 ngx_mutex_t *ngx_posted_events_mutex;
18 #endif
19 
20 
21 void
24 {
25  ngx_event_t *ev;
26 
27  for ( ;; ) {
28 
29  ev = (ngx_event_t *) *posted;
30 
32  "posted event %p", ev);
33 
34  if (ev == NULL) {
35  return;
36  }
37 
39 
40  ev->handler(ev);
41  }
42 }
43 
44 
45 #if (NGX_THREADS) && !(NGX_WIN32)
46 
47 void
49 {
50  ngx_int_t i;
51 #if 0
52  ngx_uint_t busy;
53  ngx_event_t *ev;
54 
55  busy = 1;
56 
57  if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
58  return;
59  }
60 
61  for (ev = (ngx_event_t *) ngx_posted_events; ev; ev = ev->next) {
62  if (*(ev->lock) == 0) {
63  busy = 0;
64  break;
65  }
66  }
67 
68  ngx_mutex_unlock(ngx_posted_events_mutex);
69 
70  if (busy) {
71  return;
72  }
73 #endif
74 
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);
78  return;
79  }
80  }
81 }
82 
83 
85 ngx_event_thread_process_posted(ngx_cycle_t *cycle)
86 {
87  ngx_event_t *ev;
88 
89  for ( ;; ) {
90 
92 
93  for ( ;; ) {
94 
96  "posted event %p", ev);
97 
98  if (ev == NULL) {
99  return NGX_OK;
100  }
101 
102  if (ngx_trylock(ev->lock) == 0) {
103 
105  "posted event %p is busy", ev);
106 
107  ev = ev->next;
108  continue;
109  }
110 
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);
116  ev = ev->next;
117  continue;
118  }
119  *(ev->own_lock) = 1;
120  }
121 
123 
124  ev->locked = 1;
125 
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;
131 #endif
132  if (ev->posted_available) {
133  ev->available = ev->posted_available;
134  }
135 
136  ev->posted_ready = 0;
137  ev->posted_timedout = 0;
138  ev->posted_eof = 0;
139 #if (NGX_HAVE_KQUEUE)
140  ev->posted_errno = 0;
141 #endif
142  ev->posted_available = 0;
143 
144  ngx_mutex_unlock(ngx_posted_events_mutex);
145 
146  ev->handler(ev);
147 
148  ngx_mutex_lock(ngx_posted_events_mutex);
149 
150  if (ev->locked) {
151  ngx_unlock(ev->lock);
152 
153  if (ev->lock != ev->own_lock) {
154  ngx_unlock(ev->own_lock);
155  }
156  }
157 
159  "posted event %p is done", ev);
160 
161  break;
162  }
163  }
164 }
165 
166 #else
167 
168 void
170 {
171 }
172 
173 #endif