comparison src/event/ngx_event_thread.c @ 208:0b67be7d4489

nginx-0.0.1-2003-12-08-23:48:12 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 08 Dec 2003 20:48:12 +0000
parents
children
comparison
equal deleted inserted replaced
207:6e0fef527732 208:0b67be7d4489
1
2 volitile int ngx_last_posted_event;
3
4
5 typedef struct {
6 ngx_tid_t tid;
7 ngx_cv_t cv;
8 } ngx_thread_data_t;
9
10 static ngx_thread_data_t *threead_data;
11
12
13
14
15
16 {
17
18 err = ngx_thread_cond_wait(ngx_thread_data_cv, ngx_thread_data_mutex);
19
20 tid = ngx_thread_self();
21
22 for (i = 0; i < thread_data_n; i++) {
23 if (thread_data[i].tid == tid) {
24 cv = thread_data[i].cv;
25 break;
26 }
27 }
28
29 if (i == thread_data_n) {
30 error
31 return
32 }
33
34
35 for ( ;; ) {
36
37 err = ngx_thread_cond_wait(cv, ngx_posted_events_mutex);
38 if (err) {
39 ngx_log_error(NGX_ALERT, log, err,
40 ngx_thread_cond_wait_n " failed, thread is exiting");
41 return;
42 }
43
44 for ( ;; ) {
45 ev = NULL;
46
47 for (i = ngx_last_posted_event; i > 0; i--) {
48 ev = ngx_posted_events[i];
49
50 if (ev == NULL) {
51 continue;
52 }
53
54 err = ngx_thread_mutex_trylock(ev->mutex);
55
56 if (err == 0) {
57 ngx_posted_events[i] = NULL;
58
59 while (ngx_posted_events[ngx_last_posted_event] == NULL) {
60 ngx_last_posted_event--;
61 }
62
63 break;
64 }
65
66 if (err == NGX_EBUSY) {
67 ev = NULL;
68 continue;
69 }
70
71 ngx_log_error(NGX_ALERT, log, err,
72 ngx_thread_mutex_unlock_n " failed,
73 thread is exiting");
74
75 ngx_worker_thread_error();
76 return;
77 }
78
79 err = ngx_thread_mutex_unlock(ngx_posted_events_mutex);
80 if (err) {
81 ngx_log_error(NGX_ALERT, log, err,
82 ngx_thread_mutex_unlock_n
83 " failed, thread exiting");
84 return;
85 }
86
87 if (ev == NULL) {
88 break;
89 }
90
91 ngx_event_handle_event(ev);
92
93 err = ngx_thread_mutex_unlock(ev->mutex);
94 if (err) {
95 ngx_log_error(NGX_ALERT, log, err,
96 ngx_thread_mutex_unlock_n
97 " failed, thread exiting");
98
99 ngx_worker_thread_error();
100 return;
101 }
102
103 err = ngx_thread_mutex_lock(ngx_posted_events_mutex);
104 if (err) {
105 ngx_log_error(NGX_ALERT, log, err,
106 ngx_thread_mutex_lock_n
107 " failed, thread exiting");
108 return;
109 }
110 }
111
112 if (restart) {
113 ngx_log_error(NGX_INFO, log, 0, "thread is exiting");
114 return;
115 }
116 }
117 }
118
119 ngx_worker_thread_error()
120 {
121 ngx_err_t err;
122
123 err = ngx_thread_mutex_unlock(ngx_posted_events_mutex);
124 if (err) {
125 ngx_log_error(NGX_ALERT, log, err,
126 ngx_thread_mutex_unlock_n
127 " failed, thread exiting");
128 }
129 }