Skip to content

Commit bc3b91c

Browse files
committed
Modules: engine independent method to add entries to a shared dict.
1 parent 6d74d4e commit bc3b91c

File tree

1 file changed

+74
-83
lines changed

1 file changed

+74
-83
lines changed

nginx/ngx_js_shared_dict.c

Lines changed: 74 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,6 @@ typedef struct {
2121
} ngx_js_dict_sh_t;
2222

2323

24-
typedef struct {
25-
ngx_str_node_t sn;
26-
ngx_rbtree_node_t expire;
27-
union {
28-
ngx_str_t value;
29-
double number;
30-
} u;
31-
} ngx_js_dict_node_t;
32-
33-
3424
struct ngx_js_dict_s {
3525
ngx_shm_zone_t *shm_zone;
3626
ngx_js_dict_sh_t *sh;
@@ -46,6 +36,19 @@ struct ngx_js_dict_s {
4636
};
4737

4838

39+
typedef union {
40+
ngx_str_t str; /* NGX_JS_DICT_TYPE_STRING */
41+
double number; /* NGX_JS_DICT_TYPE_NUMBER */
42+
} ngx_js_dict_value_t;
43+
44+
45+
typedef struct {
46+
ngx_str_node_t sn;
47+
ngx_rbtree_node_t expire;
48+
ngx_js_dict_value_t value;
49+
} ngx_js_dict_node_t;
50+
51+
4952
static njs_int_t njs_js_ext_shared_dict_capacity(njs_vm_t *vm,
5053
njs_object_prop_t *prop, uint32_t unused, njs_value_t *value,
5154
njs_value_t *setval, njs_value_t *retval);
@@ -1281,7 +1284,7 @@ ngx_js_dict_node_free(ngx_js_dict_t *dict, ngx_js_dict_node_t *node)
12811284
shpool = dict->shpool;
12821285

12831286
if (dict->type == NGX_JS_DICT_TYPE_STRING) {
1284-
ngx_slab_free_locked(shpool, node->u.value.data);
1287+
ngx_slab_free_locked(shpool, node->value.str.data);
12851288
}
12861289

12871290
ngx_slab_free_locked(shpool, node);
@@ -1341,12 +1344,11 @@ ngx_js_dict_set(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
13411344

13421345

13431346
static ngx_int_t
1344-
ngx_js_dict_add(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
1345-
njs_value_t *value, ngx_msec_t timeout, ngx_msec_t now)
1347+
ngx_js_dict_add_value(ngx_js_dict_t *dict, ngx_str_t *key,
1348+
ngx_js_dict_value_t *value, ngx_msec_t timeout, ngx_msec_t now)
13461349
{
13471350
size_t n;
13481351
uint32_t hash;
1349-
njs_str_t string;
13501352
ngx_js_dict_node_t *node;
13511353

13521354
if (dict->timeout) {
@@ -1364,18 +1366,17 @@ ngx_js_dict_add(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
13641366
node->sn.str.data = (u_char *) node + sizeof(ngx_js_dict_node_t);
13651367

13661368
if (dict->type == NGX_JS_DICT_TYPE_STRING) {
1367-
njs_value_string_get(vm, value, &string);
1368-
node->u.value.data = ngx_js_dict_alloc(dict, string.length);
1369-
if (node->u.value.data == NULL) {
1369+
node->value.str.data = ngx_js_dict_alloc(dict, value->str.len);
1370+
if (node->value.str.data == NULL) {
13701371
ngx_slab_free_locked(dict->shpool, node);
13711372
return NGX_ERROR;
13721373
}
13731374

1374-
ngx_memcpy(node->u.value.data, string.start, string.length);
1375-
node->u.value.len = string.length;
1375+
ngx_memcpy(node->value.str.data, value->str.data, value->str.len);
1376+
node->value.str.len = value->str.len;
13761377

13771378
} else {
1378-
node->u.number = njs_value_number(value);
1379+
node->value.number = value->number;
13791380
}
13801381

13811382
node->sn.node.key = hash;
@@ -1394,6 +1395,29 @@ ngx_js_dict_add(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
13941395
}
13951396

13961397

1398+
static ngx_int_t
1399+
ngx_js_dict_add(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
1400+
njs_value_t *value, ngx_msec_t timeout, ngx_msec_t now)
1401+
{
1402+
njs_str_t string;
1403+
ngx_js_dict_value_t entry;
1404+
1405+
if (dict->type == NGX_JS_DICT_TYPE_STRING) {
1406+
njs_value_string_get(vm, value, &string);
1407+
1408+
entry.str.data = string.start;
1409+
entry.str.len = string.length;
1410+
1411+
} else {
1412+
/* GCC complains about uninitialized entry.str.data. */
1413+
entry.str.data = NULL;
1414+
entry.number = njs_value_number(value);
1415+
}
1416+
1417+
return ngx_js_dict_add_value(dict, key, &entry, timeout, now);
1418+
}
1419+
1420+
13971421
static ngx_int_t
13981422
ngx_js_dict_update(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_js_dict_node_t *node,
13991423
njs_value_t *value, ngx_msec_t timeout, ngx_msec_t now)
@@ -1409,14 +1433,14 @@ ngx_js_dict_update(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_js_dict_node_t *node,
14091433
return NGX_ERROR;
14101434
}
14111435

1412-
ngx_slab_free_locked(dict->shpool, node->u.value.data);
1436+
ngx_slab_free_locked(dict->shpool, node->value.str.data);
14131437
ngx_memcpy(p, string.start, string.length);
14141438

1415-
node->u.value.data = p;
1416-
node->u.value.len = string.length;
1439+
node->value.str.data = p;
1440+
node->value.str.len = string.length;
14171441

14181442
} else {
1419-
node->u.number = njs_value_number(value);
1443+
node->value.number = njs_value_number(value);
14201444
}
14211445

14221446
if (dict->timeout) {
@@ -1502,8 +1526,8 @@ ngx_js_dict_incr(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
15021526
*value = njs_value_number(init);
15031527

15041528
} else {
1505-
node->u.number += njs_value_number(delta);
1506-
*value = node->u.number;
1529+
node->value.number += njs_value_number(delta);
1530+
*value = node->value.number;
15071531

15081532
if (dict->timeout) {
15091533
ngx_rbtree_delete(&dict->sh->rbtree_expire, &node->expire);
@@ -1568,14 +1592,14 @@ ngx_js_dict_copy_value_locked(njs_vm_t *vm, ngx_js_dict_t *dict,
15681592
type = dict->type;
15691593

15701594
if (type == NGX_JS_DICT_TYPE_STRING) {
1571-
ret = njs_vm_value_string_create(vm, retval, node->u.value.data,
1572-
node->u.value.len);
1595+
ret = njs_vm_value_string_create(vm, retval, node->value.str.data,
1596+
node->value.str.len);
15731597
if (ret != NJS_OK) {
15741598
return NGX_ERROR;
15751599
}
15761600

15771601
} else {
1578-
njs_value_number_set(retval, node->u.number);
1602+
njs_value_number_set(retval, node->value.number);
15791603
}
15801604

15811605
return NGX_OK;
@@ -2625,13 +2649,13 @@ ngx_qjs_dict_copy_value_locked(JSContext *cx, ngx_js_dict_t *dict,
26252649
ngx_js_dict_node_t *node)
26262650
{
26272651
if (dict->type == NGX_JS_DICT_TYPE_STRING) {
2628-
return JS_NewStringLen(cx, (const char *) node->u.value.data,
2629-
node->u.value.len);
2652+
return JS_NewStringLen(cx, (const char *) node->value.str.data,
2653+
node->value.str.len);
26302654
}
26312655

26322656
/* NGX_JS_DICT_TYPE_NUMBER */
26332657

2634-
return JS_NewFloat64(cx, node->u.number);
2658+
return JS_NewFloat64(cx, node->value.number);
26352659
}
26362660

26372661

@@ -2653,64 +2677,31 @@ static ngx_int_t
26532677
ngx_qjs_dict_add(JSContext *cx, ngx_js_dict_t *dict, ngx_str_t *key,
26542678
JSValue value, ngx_msec_t timeout, ngx_msec_t now)
26552679
{
2656-
size_t n;
2657-
uint32_t hash;
2658-
ngx_str_t string;
2659-
ngx_js_dict_node_t *node;
2660-
2661-
if (dict->timeout) {
2662-
ngx_js_dict_expire(dict, now);
2663-
}
2664-
2665-
n = sizeof(ngx_js_dict_node_t) + key->len;
2666-
hash = ngx_crc32_long(key->data, key->len);
2667-
2668-
node = ngx_js_dict_alloc(dict, n);
2669-
if (node == NULL) {
2670-
return NGX_ERROR;
2671-
}
2672-
2673-
node->sn.str.data = (u_char *) node + sizeof(ngx_js_dict_node_t);
2680+
ngx_int_t rc;
2681+
ngx_js_dict_value_t entry;
26742682

26752683
if (dict->type == NGX_JS_DICT_TYPE_STRING) {
2676-
string.data = (u_char *) JS_ToCStringLen(cx, &string.len, value);
2677-
if (string.data == NULL) {
2678-
ngx_slab_free_locked(dict->shpool, node);
2679-
return NGX_ERROR;
2680-
}
2681-
2682-
node->u.value.data = ngx_js_dict_alloc(dict, string.len);
2683-
if (node->u.value.data == NULL) {
2684-
ngx_slab_free_locked(dict->shpool, node);
2685-
JS_FreeCString(cx, (char *) string.data);
2684+
entry.str.data = (u_char *) JS_ToCStringLen(cx, &entry.str.len, value);
2685+
if (entry.str.data == NULL) {
26862686
return NGX_ERROR;
26872687
}
26882688

2689-
ngx_memcpy(node->u.value.data, string.data, string.len);
2690-
node->u.value.len = string.len;
2691-
2692-
JS_FreeCString(cx, (char *) string.data);
2693-
26942689
} else {
2695-
if (JS_ToFloat64(cx, &node->u.number, value) < 0) {
2696-
ngx_slab_free_locked(dict->shpool, node);
2690+
/* GCC complains about uninitialized entry.str.data. */
2691+
entry.str.data = NULL;
2692+
2693+
if (JS_ToFloat64(cx, &entry.number, value) < 0) {
26972694
return NGX_ERROR;
26982695
}
26992696
}
27002697

2701-
node->sn.node.key = hash;
2698+
rc = ngx_js_dict_add_value(dict, key, &entry, timeout, now);
27022699

2703-
ngx_memcpy(node->sn.str.data, key->data, key->len);
2704-
node->sn.str.len = key->len;
2705-
2706-
ngx_rbtree_insert(&dict->sh->rbtree, &node->sn.node);
2707-
2708-
if (dict->timeout) {
2709-
node->expire.key = now + timeout;
2710-
ngx_rbtree_insert(&dict->sh->rbtree_expire, &node->expire);
2700+
if (dict->type == NGX_JS_DICT_TYPE_STRING) {
2701+
JS_FreeCString(cx, (char *) entry.str.data);
27112702
}
27122703

2713-
return NGX_OK;
2704+
return rc;
27142705
}
27152706

27162707

@@ -2824,8 +2815,8 @@ ngx_qjs_dict_incr(JSContext *cx, ngx_js_dict_t *dict, ngx_str_t *key,
28242815
}
28252816

28262817
} else {
2827-
node->u.number += delta;
2828-
value = JS_NewFloat64(cx, node->u.number);
2818+
node->value.number += delta;
2819+
value = JS_NewFloat64(cx, node->value.number);
28292820

28302821
if (dict->timeout) {
28312822
ngx_rbtree_delete(&dict->sh->rbtree_expire, &node->expire);
@@ -2912,16 +2903,16 @@ ngx_qjs_dict_update(JSContext *cx, ngx_js_dict_t *dict,
29122903
return NGX_ERROR;
29132904
}
29142905

2915-
ngx_slab_free_locked(dict->shpool, node->u.value.data);
2906+
ngx_slab_free_locked(dict->shpool, node->value.str.data);
29162907
ngx_memcpy(p, string.data, string.len);
29172908

2918-
node->u.value.data = p;
2919-
node->u.value.len = string.len;
2909+
node->value.str.data = p;
2910+
node->value.str.len = string.len;
29202911

29212912
JS_FreeCString(cx, (char *) string.data);
29222913

29232914
} else {
2924-
if (JS_ToFloat64(cx, &node->u.number, value) < 0) {
2915+
if (JS_ToFloat64(cx, &node->value.number, value) < 0) {
29252916
return NGX_ERROR;
29262917
}
29272918
}

0 commit comments

Comments
 (0)