Sitelet https://github.com/phpredis/phpredis/commit/aba09933db05a1a36e947c6fa9dca9889c6a77ff
Skip to content

Commit aba0993

Browse files
JakubOnderkamichael-grunder
authored andcommitted
Avoid unnecessary allocation in redis_hset_cmd
This will slightly reduce memory usage for HSET command
1 parent 4082dd0 commit aba0993

1 file changed

Lines changed: 18 additions & 27 deletions

File tree

‎redis_commands.c‎

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3447,54 +3447,48 @@ int redis_hset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
34473447
{
34483448
int i, argc;
34493449
smart_string cmdstr = {0};
3450-
zend_string *zkey;
3451-
zval *z_args, *z_ele;
3452-
3453-
if ((argc = ZEND_NUM_ARGS()) < 2) {
3454-
return FAILURE;
3455-
}
3450+
zend_string *key, *zkey;
3451+
zval *args, *z_ele;
34563452

3457-
z_args = ecalloc(argc, sizeof(*z_args));
3458-
if (zend_get_parameters_array(ht, argc, z_args) == FAILURE) {
3459-
efree(z_args);
3460-
return FAILURE;
3461-
}
3453+
ZEND_PARSE_PARAMETERS_START(2, -1)
3454+
Z_PARAM_STR(key)
3455+
Z_PARAM_VARIADIC('*', args, argc)
3456+
ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
34623457

3463-
if (argc == 2) {
3464-
if (Z_TYPE(z_args[1]) != IS_ARRAY || zend_hash_num_elements(Z_ARRVAL(z_args[1])) == 0) {
3465-
efree(z_args);
3458+
if (argc == 1) {
3459+
if (Z_TYPE_P(args) != IS_ARRAY || zend_hash_num_elements(Z_ARRVAL_P(args)) == 0) {
34663460
return FAILURE;
34673461
}
34683462

34693463
/* Initialize our command */
3470-
redis_cmd_init_sstr(&cmdstr, 1 + zend_hash_num_elements(Z_ARRVAL(z_args[1])) * 2, ZEND_STRL("HSET"));
3464+
redis_cmd_init_sstr(&cmdstr, 1 + zend_hash_num_elements(Z_ARRVAL_P(args)) * 2, ZEND_STRL("HSET"));
34713465

34723466
/* Append key */
3473-
redis_cmd_append_sstr_key_zval(&cmdstr, &z_args[0], redis_sock, slot);
3467+
redis_cmd_append_sstr_key_zstr(&cmdstr, key, redis_sock, slot);
34743468

3475-
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL(z_args[1]), zkey, z_ele) {
3469+
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(args), zkey, z_ele) {
34763470
if (zkey != NULL) {
34773471
ZVAL_DEREF(z_ele);
34783472
redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(zkey), ZSTR_LEN(zkey));
34793473
redis_cmd_append_sstr_zval(&cmdstr, z_ele, redis_sock);
34803474
}
34813475
} ZEND_HASH_FOREACH_END();
34823476
} else {
3483-
if (argc % 2 == 0) {
3484-
efree(z_args);
3477+
if (argc % 2 != 0) {
34853478
return FAILURE;
34863479
}
3480+
34873481
/* Initialize our command */
3488-
redis_cmd_init_sstr(&cmdstr, argc, ZEND_STRL("HSET"));
3482+
redis_cmd_init_sstr(&cmdstr, argc + 1, ZEND_STRL("HSET"));
34893483

34903484
/* Append key */
3491-
redis_cmd_append_sstr_key_zval(&cmdstr, &z_args[0], redis_sock, slot);
3485+
redis_cmd_append_sstr_key_zstr(&cmdstr, key, redis_sock, slot);
34923486

3493-
for (i = 1; i < argc; ++i) {
3487+
for (i = 0; i < argc; ++i) {
34943488
if (i % 2) {
3495-
redis_cmd_append_sstr_zval(&cmdstr, &z_args[i], NULL);
3489+
redis_cmd_append_sstr_zval(&cmdstr, &args[i], redis_sock);
34963490
} else {
3497-
redis_cmd_append_sstr_zval(&cmdstr, &z_args[i], redis_sock);
3491+
redis_cmd_append_sstr_zval(&cmdstr, &args[i], NULL);
34983492
}
34993493
}
35003494
}
@@ -3503,9 +3497,6 @@ int redis_hset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
35033497
*cmd = cmdstr.c;
35043498
*cmd_len = cmdstr.len;
35053499

3506-
// Cleanup arg array
3507-
efree(z_args);
3508-
35093500
return SUCCESS;
35103501
}
35113502

0 commit comments

Comments
 (0)