One Level Up
Top Level
src/event/ngx_event_busy_lock.c - nginx-1.7.10
Functions defined
Source code
- #include <ngx_config.h>
- #include <ngx_core.h>
- #include <ngx_event.h>
- static ngx_int_t ngx_event_busy_lock_look_cacheable(ngx_event_busy_lock_t *bl,
- ngx_event_busy_lock_ctx_t *ctx);
- static void ngx_event_busy_lock_handler(ngx_event_t *ev);
- static void ngx_event_busy_lock_posted_handler(ngx_event_t *ev);
- ngx_int_t
- ngx_event_busy_lock(ngx_event_busy_lock_t *bl, ngx_event_busy_lock_ctx_t *ctx)
- {
- ngx_int_t rc;
- ngx_mutex_lock(bl->mutex);
- ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->event->log, 0,
- "event busy lock: b:%d mb:%d",
- bl->busy, bl->max_busy);
- if (bl->busy < bl->max_busy) {
- bl->busy++;
- rc = NGX_OK;
- } else if (ctx->timer && bl->waiting < bl->max_waiting) {
- bl->waiting++;
- ngx_add_timer(ctx->event, ctx->timer);
- ctx->event->handler = ngx_event_busy_lock_handler;
- if (bl->events) {
- bl->last->next = ctx;
- } else {
- bl->events = ctx;
- }
- bl->last = ctx;
- rc = NGX_AGAIN;
- } else {
- rc = NGX_BUSY;
- }
- ngx_mutex_unlock(bl->mutex);
- return rc;
- }
- ngx_int_t
- ngx_event_busy_lock_cacheable(ngx_event_busy_lock_t *bl,
- ngx_event_busy_lock_ctx_t *ctx)
- {
- ngx_int_t rc;
- ngx_mutex_lock(bl->mutex);
- rc = ngx_event_busy_lock_look_cacheable(bl, ctx);
- ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ctx->event->log, 0,
- "event busy lock: %d w:%d mw:%d",
- rc, bl->waiting, bl->max_waiting);
-
- if (rc == NGX_AGAIN) {
- if (ctx->timer && bl->waiting < bl->max_waiting) {
- bl->waiting++;
- ngx_add_timer(ctx->event, ctx->timer);
- ctx->event->handler = ngx_event_busy_lock_handler;
- if (bl->events == NULL) {
- bl->events = ctx;
- } else {
- bl->last->next = ctx;
- }
- bl->last = ctx;
- } else {
- rc = NGX_BUSY;
- }
- }
- ngx_mutex_unlock(bl->mutex);
- return rc;
- }
- void
- ngx_event_busy_unlock(ngx_event_busy_lock_t *bl,
- ngx_event_busy_lock_ctx_t *ctx)
- {
- ngx_event_t *ev;
- ngx_event_busy_lock_ctx_t *wakeup;
- ngx_mutex_lock(bl->mutex);
- if (bl->events) {
- wakeup = bl->events;
- bl->events = bl->events->next;
- } else {
- wakeup = NULL;
- bl->busy--;
- }
-
- if (wakeup == NULL) {
- ngx_mutex_unlock(bl->mutex);
- return;
- }
- if (ctx->md5) {
- for (wakeup = bl->events; wakeup; wakeup = wakeup->next) {
- if (wakeup->md5 == NULL || wakeup->slot != ctx->slot) {
- continue;
- }
- wakeup->handler = ngx_event_busy_lock_posted_handler;
- wakeup->cache_updated = 1;
- ev = wakeup->event;
- ngx_post_event(ev, &ngx_posted_events);
- }
- ngx_mutex_unlock(bl->mutex);
- } else {
- bl->waiting--;
- ngx_mutex_unlock(bl->mutex);
- wakeup->handler = ngx_event_busy_lock_posted_handler;
- wakeup->locked = 1;
- ev = wakeup->event;
- if (ev->timer_set) {
- ngx_del_timer(ev);
- }
- ngx_post_event(ev, &ngx_posted_events);
- }
- }
- void
- ngx_event_busy_lock_cancel(ngx_event_busy_lock_t *bl,
- ngx_event_busy_lock_ctx_t *ctx)
- {
- ngx_event_busy_lock_ctx_t *c, *p;
- ngx_mutex_lock(bl->mutex);
- bl->waiting--;
- if (ctx == bl->events) {
- bl->events = ctx->next;
- } else {
- p = bl->events;
- for (c = bl->events->next; c; c = c->next) {
- if (c == ctx) {
- p->next = ctx->next;
- break;
- }
- p = c;
- }
- }
- ngx_mutex_unlock(bl->mutex);
- }
- static ngx_int_t
- ngx_event_busy_lock_look_cacheable(ngx_event_busy_lock_t *bl,
- ngx_event_busy_lock_ctx_t *ctx)
- {
- ngx_int_t free;
- ngx_uint_t i, bit, cacheable, mask;
- bit = 0;
- cacheable = 0;
- free = -1;
- #if (NGX_SUPPRESS_WARN)
- mask = 0;
- #endif
- for (i = 0; i < bl->max_busy; i++) {
- if ((bit & 7) == 0) {
- mask = bl->md5_mask[i / 8];
- }
- if (mask & 1) {
- if (ngx_memcmp(&bl->md5[i * 16], ctx->md5, 16) == 0) {
- ctx->waiting = 1;
- ctx->slot = i;
- return NGX_AGAIN;
- }
- cacheable++;
- } else if (free == -1) {
- free = i;
- }
- if (cacheable == bl->cacheable) {
- if (free == -1 && cacheable < bl->max_busy) {
- free = i + 1;
- }
- break;
- }
- mask >>= 1;
- bit++;
- }
- if (free == -1) {
- return NGX_BUSY;
- }
- #if 0
- #endif
- ngx_memcpy(&bl->md5[free * 16], ctx->md5, 16);
- bl->md5_mask[free / 8] |= 1 << (free & 7);
- ctx->slot = free;
- bl->cacheable++;
- bl->busy++;
- return NGX_OK;
- }
- static void
- ngx_event_busy_lock_handler(ngx_event_t *ev)
- {
- ev->handler = ngx_event_busy_lock_posted_handler;
- ngx_post_event(ev, &ngx_posted_events);
- }
- static void
- ngx_event_busy_lock_posted_handler(ngx_event_t *ev)
- {
- ngx_event_busy_lock_ctx_t *ctx;
- ctx = ev->data;
- ctx->handler(ev);
- }
One Level Up
Top Level