Mercurial > hg > nginx
diff src/http/ngx_http_busy_lock.c @ 175:e92c2c647c57
nginx-0.0.1-2003-11-05-20:03:41 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 05 Nov 2003 17:03:41 +0000 |
parents | ea464a6c0581 |
children | c0552e5ab567 |
line wrap: on
line diff
--- a/src/http/ngx_http_busy_lock.c +++ b/src/http/ngx_http_busy_lock.c @@ -4,6 +4,61 @@ #include <ngx_http.h> +int ngx_http_busy_lock(ngx_http_busy_lock_t *bl, u_char *md5) +{ + int i, b, busy, free; + u_int mask; + + b = 0; + busy = 0; + free = -1; + +#if (NGX_SUPPRESS_WARN) + mask = 0; +#endif + + for (i = 0; i < bl->max_conn; i++) { + + if ((b & 7) == 0) { + mask = bl->busy_mask[i / 8]; + } + + if (mask & 1) { + if (ngx_memcmp(&bl->busy[i * 16], md5, 16) == 0) { + return NGX_AGAIN; + } + busy++; + + } else if (free == -1) { + free = i; + } + + if (busy == bl->busy_n) { + if (busy < bl->max_conn) { + free = i + 1; + } + + break; + } + + mask >>= 1; + b++; + } + + if (free == -1) { + return NGX_ERROR; + } + + ngx_memcpy(&bl->busy[free * 16], md5, 16); + bl->busy_mask[free / 8] |= free % 8; + + bl->busy_n++; + bl->conn_n++; + + return NGX_OK; +} + + char *ngx_http_set_busy_lock_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { @@ -26,7 +81,7 @@ char *ngx_http_set_busy_lock_slot(ngx_co value = (ngx_str_t *) cf->args->elts; - for (i = 1; i < 3; i++) { + for (i = 1; i < 4; i++) { if (value[i].len > 2 && ngx_strncasecmp(value[i].data, "c:", 2) == 0) { if (bl->max_conn) { @@ -68,7 +123,7 @@ char *ngx_http_set_busy_lock_slot(ngx_co return NGX_CONF_ERROR; } - bl->timeout = ngx_parse_time(&value[1], 0); + bl->timeout = ngx_parse_time(&value[1], 1); if (bl->timeout == NGX_ERROR) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid timeout \"%s\"", value[i].data);