upstream nginx-0.7.31
[nginx.git] / nginx / src / event / ngx_event_mutex.c
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,
16                    "lock event mutex %p lock:%XD", m, m->lock);
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,
51                       "tring to unlock the free event mutex %p", m);
52         return NGX_ERROR;
53     }
54
55     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
56                    "unlock event mutex %p, next event: %p", m, m->events);
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 }