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);