view src/event/ngx_event_mutex.c @ 632:65fd8be45530 NGINX_1_0_6

nginx 1.0.6 *) Feature: cache loader run time decrease. *) Feature: loading time decrease of configuration with large number of HTTPS sites. *) Feature: now nginx supports ECDHE key exchange ciphers. Thanks to Adrian Kotelba. *) Feature: the "lingering_close" directive. *) Feature: now shared zones and caches use POSIX semaphores on Solaris. Thanks to Den Ivanov. *) Bugfix: nginx could not be built on Linux 3.0. *) Bugfix: a segmentation fault might occur in a worker process if "fastcgi/scgi/uwsgi_param" directives were used with values starting with "HTTP_"; the bug had appeared in 0.8.40. *) Bugfix: in closing connection for pipelined requests. *) Bugfix: nginx did not disable gzipping if client sent "gzip;q=0" in "Accept-Encoding" request header line. *) Bugfix: in timeout in unbuffered proxied mode. *) Bugfix: memory leaks when a "proxy_pass" directive contains variables and proxies to an HTTPS backend. *) Bugfix: in parameter validaiton of a "proxy_pass" directive with variables. Thanks to Lanshun Zhou. *) Bugfix: SSL did not work on QNX. *) Bugfix: SSL modules could not be built by gcc 4.6 without --with-debug option.
author Igor Sysoev <http://sysoev.ru>
date Fri, 29 Jul 2011 00:00:00 +0400
parents 46833bd150cb
children ad25218fd14b
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;
}