0
|
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_int_t ngx_event_mutex_timedlock(ngx_event_mutex_t *m, ngx_msec_t timer,
|
|
13 ngx_event_t *ev)
|
|
14 {
|
|
15 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
|
10
|
16 "lock event mutex %p lock:%XD", m, m->lock);
|
0
|
17
|
|
18 if (m->lock) {
|
|
19
|
|
20 if (m->events == NULL) {
|
|
21 m->events = ev;
|
|
22
|
|
23 } else {
|
|
24 m->last->next = ev;
|
|
25 }
|
|
26
|
|
27 m->last = ev;
|
|
28 ev->next = NULL;
|
|
29
|
|
30 #if (NGX_THREADS0)
|
|
31 ev->light = 1;
|
|
32 #endif
|
|
33
|
|
34 ngx_add_timer(ev, timer);
|
|
35
|
|
36 return NGX_AGAIN;
|
|
37 }
|
|
38
|
|
39 m->lock = 1;
|
|
40
|
|
41 return NGX_OK;
|
|
42 }
|
|
43
|
|
44
|
|
45 ngx_int_t ngx_event_mutex_unlock(ngx_event_mutex_t *m, ngx_log_t *log)
|
|
46 {
|
|
47 ngx_event_t *ev;
|
|
48
|
|
49 if (m->lock == 0) {
|
|
50 ngx_log_error(NGX_LOG_ALERT, log, 0,
|
10
|
51 "tring to unlock the free event mutex %p", m);
|
0
|
52 return NGX_ERROR;
|
|
53 }
|
|
54
|
|
55 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
|
10
|
56 "unlock event mutex %p, next event: %p", m, m->events);
|
0
|
57
|
|
58 m->lock = 0;
|
|
59
|
|
60 if (m->events) {
|
|
61 ev = m->events;
|
|
62 m->events = ev->next;
|
|
63
|
|
64 ev->next = (ngx_event_t *) ngx_posted_events;
|
|
65 ngx_posted_events = ev;
|
|
66 }
|
|
67
|
|
68 return NGX_OK;
|
|
69 }
|