view src/event/ngx_event_mutex.c @ 486:6484cbba0222 NGINX_0_7_55

nginx 0.7.55 *) Bugfix: the http_XXX parameters in "proxy_cache_use_stale" and "fastcgi_cache_use_stale" directives did not work. *) Bugfix: fastcgi cache did not cache header only responses. *) Bugfix: of "select() failed (9: Bad file descriptor)" error in nginx/Unix and "select() failed (10022: ...)" error in nginx/Windows. *) Bugfix: a segmentation fault might occur in worker process, if an "debug_connection" directive was used; the bug had appeared in 0.7.54. *) Bugfix: fix ngx_http_image_filter_module building errors. *) Bugfix: the files bigger than 2G could not be transferred using $r->sendfile. Thanks to Maxim Dounin.
author Igor Sysoev <http://sysoev.ru>
date Wed, 06 May 2009 00:00:00 +0400
parents 46833bd150cb
children d0f7a625f27c
line wrap: on
line source


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