| |
| /* |
| * 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; |
| } |