|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  * Copyright (C) Nginx, Inc. | 
 |  */ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 | #include <ngx_event.h> | 
 |  | 
 |  | 
 | ngx_int_t ngx_event_mutex_timedlock(ngx_event_mutex_t *m, ngx_msec_t timer, | 
 |                                     ngx_event_t *ev) | 
 | { | 
 |     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 
 |                    "lock event mutex %p lock:%XD", m, m->lock); | 
 |  | 
 |     if (m->lock) { | 
 |  | 
 |         if (m->events == NULL) { | 
 |             m->events = ev; | 
 |  | 
 |         } else { | 
 |             m->last->next = ev; | 
 |         } | 
 |  | 
 |         m->last = ev; | 
 |         ev->next = NULL; | 
 |  | 
 | #if (NGX_THREADS0) | 
 |         ev->light = 1; | 
 | #endif | 
 |  | 
 |         ngx_add_timer(ev, timer); | 
 |  | 
 |         return NGX_AGAIN; | 
 |     } | 
 |  | 
 |     m->lock = 1; | 
 |  | 
 |     return NGX_OK; | 
 | } | 
 |  | 
 |  | 
 | ngx_int_t ngx_event_mutex_unlock(ngx_event_mutex_t *m, ngx_log_t *log) | 
 | { | 
 |     ngx_event_t  *ev; | 
 |  | 
 |     if (m->lock == 0) { | 
 |         ngx_log_error(NGX_LOG_ALERT, log, 0, | 
 |                       "tring to unlock the free event mutex %p", m); | 
 |         return NGX_ERROR; | 
 |     } | 
 |  | 
 |     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, | 
 |                    "unlock event mutex %p, next event: %p", m, m->events); | 
 |  | 
 |     m->lock = 0; | 
 |  | 
 |     if (m->events) { | 
 |         ev = m->events; | 
 |         m->events = ev->next; | 
 |  | 
 |         ev->next = (ngx_event_t *) ngx_posted_events; | 
 |         ngx_posted_events = ev; | 
 |     } | 
 |  | 
 |     return NGX_OK; | 
 | } |