]> git.kaiwu.me - njs.git/commitdiff
Modules: fixed clear() method of a shared dictionary without timeout.
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 20 Mar 2024 04:05:51 +0000 (21:05 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 20 Mar 2024 04:05:51 +0000 (21:05 -0700)
Previously, the code did not unlock the rwlock when a dict was empty.

The issue was introduced in 4a15613f4e8b (0.8.3).

This closes issue #699 on Github.

nginx/ngx_js_shared_dict.c
nginx/t/js_shared_dict.t

index 66227428f355450711cd183abed01f788d9b63a6..3c94bd585e7fd5b7079d28af1d0a6ac88779cd2e 100644 (file)
@@ -479,7 +479,7 @@ njs_js_ext_shared_dict_clear(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         rbtree = &dict->sh->rbtree;
 
         if (rbtree->root == rbtree->sentinel) {
-            return NJS_OK;
+            goto done;
         }
 
         for (rn = ngx_rbtree_min(rbtree->root, rbtree->sentinel);
@@ -494,6 +494,8 @@ njs_js_ext_shared_dict_clear(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         }
     }
 
+done:
+
     ngx_rwlock_unlock(&dict->sh->rwlock);
 
     njs_value_undefined_set(retval);
index bfa45c60e75811a1d2b7625005c0b1fb0afef6fa..20ab87a3c65dabdf1fbab9c3af9e3aa8b01ed05d 100644 (file)
@@ -266,6 +266,7 @@ $t->write_file('test.js', <<'EOF');
 
     function set_clear(r) {
         var dict = ngx.shared.no_timeout;
+        dict.clear();
         dict.set("test", "test value");
         dict.set("test1", "test1 value");
         dict.clear();