|  |  | 
|  | /* | 
|  | * Copyright (C) Igor Sysoev | 
|  | */ | 
|  |  | 
|  |  | 
|  | #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; | 
|  | } |