}
+static ngx_rbtree_key_t
+ngx_js_dict_expire_unlink(ngx_js_dict_t *dict, ngx_js_dict_node_t *node)
+{
+ ngx_rbtree_key_t expire;
+
+ /* ngx_rbtree_delete() clears the node key. */
+ expire = node->expire.key;
+
+ ngx_rbtree_delete(&dict->sh->rbtree_expire, &node->expire);
+
+ return expire;
+}
+
+
static ngx_int_t
ngx_js_dict_set(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
njs_value_t *value, ngx_msec_t timeout, unsigned flags)
ngx_int_t rc;
ngx_msec_t now;
ngx_time_t *tp;
+ ngx_rbtree_key_t expire;
ngx_js_dict_node_t *node;
ngx_rwlock_wlock(&dict->sh->rwlock);
return NGX_DECLINED;
}
+ expire = 0;
+
if (dict->timeout) {
- ngx_rbtree_delete(&dict->sh->rbtree_expire, &node->expire);
+ expire = ngx_js_dict_expire_unlink(dict, node);
}
ngx_rbtree_delete(&dict->sh->rbtree, (ngx_rbtree_node_t *) node);
tp = ngx_timeofday();
now = tp->sec * 1000 + tp->msec;
- if (!dict->timeout || now < node->expire.key) {
+ if (!dict->timeout || now < expire) {
rc = ngx_js_dict_copy_value_locked(vm, dict, node, retval);
} else {
JSValue ret;
ngx_msec_t now;
ngx_time_t *tp;
+ ngx_rbtree_key_t expire;
ngx_js_dict_node_t *node;
ngx_rwlock_wlock(&dict->sh->rwlock);
return JS_UNDEFINED;
}
+ expire = 0;
+
if (dict->timeout) {
- ngx_rbtree_delete(&dict->sh->rbtree_expire, &node->expire);
+ expire = ngx_js_dict_expire_unlink(dict, node);
}
ngx_rbtree_delete(&dict->sh->rbtree, (ngx_rbtree_node_t *) node);
tp = ngx_timeofday();
now = tp->sec * 1000 + tp->msec;
- if (!dict->timeout || now < node->expire.key) {
+ if (!dict->timeout || now < expire) {
ret = ngx_qjs_dict_copy_value_locked(cx, dict, node);
} else {
$t->try_run('no js_shared_dict_zone');
-$t->plan(59);
+$t->plan(61);
###############################################################################
like(http_get('/pop?dict=bar&key=FOO'), qr/zzz/, 'pop bar.FOO');
like(http_get('/pop?dict=bar&key=FOO'), qr/undefined/, 'pop deleted bar.FOO');
+
+http_get('/set?dict=foo&key=POP&value=alive');
+like(http_get('/pop?dict=foo&key=POP'), qr/alive/, 'pop unexpired foo.POP');
+like(http_get('/pop?dict=foo&key=POP'), qr/undefined/, 'pop deleted foo.POP');
+
http_get('/set?dict=foo&key=BAR&value=xxx');
like(http_get('/clear?dict=foo'), qr/undefined/, 'clear foo');