8000 Normalize Redis callback prototypes and stop typecasting. (#1935) · phpredis/phpredis@e61ee1d · GitHub
[go: up one dir, main page]

Skip to content

Commit e61ee1d

Browse files
Normalize Redis callback prototypes and stop typecasting. (#1935)
1 parent 1f2a7ef commit e61ee1d

File tree

7 files changed

+111
-80
lines changed

7 files changed

+111
-80
lines changed

common.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ typedef enum {
139139

140140
#define REDIS_SAVE_CALLBACK(callback, closure_context) do { \
141141
fold_item *fi = malloc(sizeof(fold_item)); \
142-
fi->fun = (void *)callback; \
142+
fi->fun = callback; \
143143
fi->ctx = closure_context; \
144144
fi->next = NULL; \
145145
if (redis_sock->current) { \
@@ -194,7 +194,7 @@ typedef enum {
194194
REDIS_PROCESS_RESPONSE_CLOSURE(resp_func, ctx) \
195195
}
196196

197-
/* Process a command but with a specific command building function
197+
/* Process a command but with a specific command building function
198198
* and keyword which is passed to us*/
199199
#define REDIS_PROCESS_KW_CMD(kw, cmdfunc, resp_func) \
200200
RedisSock *redis_sock; char *cmd; int cmd_len; void *ctx=NULL; \
@@ -255,12 +255,6 @@ typedef enum {
255255
#endif
256256
#endif
257257

258-
typedef struct fold_item {
259-
zval * (*fun)(INTERNAL_FUNCTION_PARAMETERS, void *, ...);
260-
void *ctx;
261-
struct fold_item *next;
262-
} fold_item;
263-
264258
/* {{{ struct RedisSock */
265259
typedef struct {
266260
php_stream *stream;
@@ -285,8 +279,8 @@ typedef struct {
285279
zend_string *prefix;
286280

287281
short mode;
288-
fold_item *head;
289-
fold_item *current;
282+
struct fold_item *head;
283+
struct fold_item *current;
290284

291285
zend_string *pipeline_cmd;
292286

@@ -301,6 +295,16 @@ typedef struct {
301295
} RedisSock;
302296
/* }}} */
303297

298+
/* Redis response handler function callback prototype */
299+
typedef void (*ResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
300+
typedef int (*FailableResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock*, zval*, void*);
301+
302+
typedef struct fold_item {
303+
FailableResultCallback fun;
304+
void *ctx;
305+
struct fold_item *next;
306+
} fold_item;
307+
304308
typedef struct {
305309
zend_llist list;
306310
int nb_active;

library.c

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,40 +1013,45 @@ int redis_cmd_append_sstr_arrkey(smart_string *cmd, zend_string *kstr, zend_ulon
10131013
return redis_cmd_append_sstr(cmd, arg, len);
10141014
}
10151015

1016-
PHP_REDIS_API void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1016+
PHP_REDIS_API int
1017+
redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
10171018

10181019
char *response;
10191020
int response_len;
10201021
double ret;
10211022

10221023
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
10231024
if (IS_ATOMIC(redis_sock)) {
1024-
RETURN_FALSE;
1025+
RETVAL_FALSE;
1026+
} else {
1027+
add_next_index_bool(z_tab, 0);
10251028
}
1026-
add_next_index_bool(z_tab, 0);
1027-
return;
1029+
return FAILURE;
10281030
}
10291031

10301032
ret = atof(response);
10311033
efree(response);
10321034
if (IS_ATOMIC(redis_sock)) {
1033-
RETURN_DOUBLE(ret);
1035+
RETVAL_DOUBLE(ret);
10341036
} else {
10351037
add_next_index_double(z_tab, ret);
10361038
}
1039+
1040+
return SUCCESS;
10371041
}
10381042

1039-
PHP_REDIS_API void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1043+
PHP_REDIS_API int redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
10401044
char *response;
10411045
int response_len;
10421046
long l;
10431047

10441048
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
10451049
if (IS_ATOMIC(redis_sock)) {
1046-
RETURN_FALSE;
1050+
RETVAL_FALSE;
1051+
} else {
1052+
add_next_index_bool(z_tab, 0);
10471053
}
1048-
add_next_index_bool(z_tab, 0);
1049-
return;
1054+
return FAILURE;
10501055
}
10511056

10521057
if (strncmp(response, "+string", 7) == 0) {
@@ -1067,20 +1072,23 @@ PHP_REDIS_API void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *
10671072

10681073
efree(response);
10691074
if (IS_ATOMIC(redis_sock)) {
1070-
RETURN_LONG(l);
1075+
RETVAL_LONG(l);
10711076
} else {
10721077
add_next_index_long(z_tab, l);
10731078
}
1079+
1080+
return SUCCESS;
10741081
}
10751082

1076-
PHP_REDIS_API void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1083+
PHP_REDIS_API int redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
10771084
char *response;
10781085
int response_len;
10791086
zval z_ret;
10801087

10811088
/* Read bulk response */
10821089
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
1083-
RETURN_FALSE;
1090+
RETVAL_FALSE;
1091+
return FAILURE;
10841092
}
10851093

10861094
/* Parse it into a zval array */
@@ -1095,6 +1103,8 @@ PHP_REDIS_API void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *
10951103
} else {
10961104
add_next_index_zval(z_tab, &z_ret);
10971105
}
1106+
1107+
return SUCCESS;
10981108
}
10991109

11001110
PHP_REDIS_API void
@@ -1151,14 +1161,16 @@ redis_parse_info_response(char *response, zval *z_ret)
11511161
* Specialized handling of the CLIENT LIST output so it comes out in a simple way for PHP userland code
11521162
* to handle.
11531163
*/
1154-
PHP_REDIS_API void redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
1164+
PHP_REDIS_API int
1165+
redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
11551166
char *resp;
11561167
int resp_len;
11571168
zval z_ret;
11581169

11591170
/* Make sure we can read the bulk response from Redis */
11601171
if ((resp = redis_sock_read(redis_sock, &resp_len)) == NULL) {
1161-
RETURN_FALSE;
1172+
RETVAL_FALSE;
1173+
return FAILURE;
11621174
}
11631175

11641176
/* Parse it out */
@@ -1173,6 +1185,8 @@ PHP_REDIS_API void redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSo
11731185
} else {
11741186
add_next_index_zval(z_tab, &z_ret);
11751187
}
1188+
1189+
return SUCCESS;
11761190
}
11771191

11781192
PHP_REDIS_API void
@@ -1270,7 +1284,7 @@ redis_parse_client_list_response(char *response, zval *z_ret)
12701284
}
12711285
}
12721286

1273-
PHP_REDIS_API void
1287+
PHP_REDIS_API int
12741288
redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
12751289
zval *z_tab, void *ctx,
12761290
SuccessCallback success_callback)
@@ -1289,36 +1303,38 @@ redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
12891303
success_callback(redis_sock);
12901304
}
12911305
if (IS_ATOMIC(redis_sock)) {
1292-
RETURN_BOOL(ret);
1306+
RETVAL_BOOL(ret);
12931307
} else {
12941308
add_next_index_bool(z_tab, ret);
12951309
}
1310+
1311+
return ret ? SUCCESS : FAILURE;
12961312
}
12971313

1298-
PHP_REDIS_API void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS,
1314+
PHP_REDIS_API int redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS,
12991315
RedisSock *redis_sock, zval *z_tab,
13001316
void *ctx)
13011317
{
1302-
redis_boolean_response_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
1303-
z_tab, ctx, NULL);
1318+
return redis_boolean_response_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
1319+
z_tab, ctx, NULL);
13041320
}
13051321

1306-
PHP_REDIS_API void redis_long_response(INTERNAL_FUNCTION_PARAMETERS,
1307-
RedisSock *redis_sock, zval * z_tab,
1308-
void *ctx)
1322+
PHP_REDIS_API int redis_long_response(INTERNAL_FUNCTION_PARAMETERS,
1323+
RedisSock *redis_sock, zval * z_tab,
1324+
void *ctx)
13091325
{
13101326

13111327
char *response;
13121328
int response_len;
13131329

1314-
if ((response = redis_sock_read(redis_sock, &response_len))
1315-
== NULL)
1316-
{
1330+
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
13171331
if (IS_ATOMIC(redis_sock)) {
1318-
RETURN_FALSE;
1332+
RETVAL_FALSE;
1333+
} else {
1334+
add_next_index_bool(z_tab, 0);
13191335
}
1320-
add_next_index_bool(z_tab, 0);
1321-
return;
1336+
1337+
return FAILURE;
13221338
}
13231339

13241340
if(response[0] == ':') {
@@ -1343,8 +1359,12 @@ PHP_REDIS_API void redis_long_response(INTERNAL_FUNCTION_PARAMETERS,
13431359
} else {
13441360
add_next_index_null(z_tab);
13451361
}
1362+
efree(response);
1363+
return FAILURE;
13461364
}
1365+
13471366
efree(response);
1367+
return SUCCESS;
13481368
}
13491369

13501370
/* Helper method to convert [key, value, key, value] into [key => value,
@@ -1925,7 +1945,7 @@ PHP_REDIS_API int redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAMETERS, Re
19251945
z_tab, UNSERIALIZE_VALS, SCORE_DECODE_NONE);
19261946
}
19271947

1928-
PHP_REDIS_API void
1948+
PHP_REDIS_API int
19291949
redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
19301950
{
19311951
char *response;
@@ -1938,13 +1958,15 @@ redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_ta
19381958
}
19391959

19401960
if (IS_ATOMIC(redis_sock)) {
1941-
RETURN_BOOL(ret);
1961+
RETVAL_BOOL(ret);
19421962
} else {
19431963
add_next_index_bool(z_tab, ret);
19441964
}
1965+
1966+
return ret ? SUCCESS : FAILURE;
19451967
}
19461968

1947-
PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1969+
PHP_REDIS_API int redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
19481970

19491971
char *response;
19501972
int response_len;
@@ -1953,10 +1975,11 @@ PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock
19531975
== NULL)
19541976
{
19551977
if (IS_ATOMIC(redis_sock)) {
1956-
RETURN_FALSE;
1978+
RETVAL_FALSE;
1979+
} else {
1980+
add_next_index_bool(z_tab, 0);
19571981
}
1958-
add_next_index_bool(z_tab, 0);
1959-
return;
1982+
return FAILURE;
19601983
}
19611984
if (IS_ATOMIC(redis_sock)) {
19621985
if (!redis_unpack(redis_sock, response, response_len, return_value)) {
@@ -1970,7 +1993,9 @@ PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock
19701993
add_next_index_stringl(z_tab, response, response_len);
19711994
}
19721995
}
1996+
19731997
efree(response);
1998+
return SUCCESS;
19741999
}
19752000

19762001
PHP_REDIS_API
@@ -1998,7 +2023,7 @@ void redis_single_line_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock
19982023
}
19992024

20002025
/* like string response, but never unserialized. */
2001-
PHP_REDIS_API void
2026+
PHP_REDIS_API int
20022027
redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
20032028
zval *z_tab, void *ctx)
20042029
{
@@ -2010,17 +2035,20 @@ redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
20102035
== NULL)
20112036
{
20122037
if (IS_ATOMIC(redis_sock)) {
2013-
RETURN_FALSE;
2038+
RETVAL_FALSE;
2039+
} else {
2040+
add_next_index_bool(z_tab, 0);
20142041
}
2015-
add_next_index_bool(z_tab, 0);
2016-
return;
2042+
return FAILURE;
20172043
}
20182044
if (IS_ATOMIC(redis_sock)) {
20192045
RETVAL_STRINGL(response, response_len);
20202046
} else {
20212047
add_next_index_stringl(z_tab, response, response_len);
20222048
}
2049+
20232050
efree(response);
2051+
return SUCCESS;
20242052
}
20252053

20262054
/* Response for DEBUG object which is a formatted single line reply */

library.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,20 @@ PHP_REDIS_API zend_string *redis_pool_spprintf(RedisSock *redis_sock, char *fmt,
4949

5050
PHP_REDIS_API char *redis_sock_read(RedisSock *redis_sock, int *buf_len);
5151
PHP_REDIS_API int redis_sock_gets(RedisSock *redis_sock, char *buf, int buf_size, size_t* line_len);
52-
PHP_REDIS_API void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
53-
PHP_REDIS_API void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval* z_tab, void *ctx);
52+
PHP_REDIS_API int redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
53+
PHP_REDIS_API int redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval* z_tab, void *ctx);
5454
typedef void (*SuccessCallback)(RedisSock *redis_sock);
55-
PHP_REDIS_API void redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx, SuccessCallback success_callback);
56-
PHP_REDIS_API void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
57-
PHP_REDIS_API void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
58-
PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
55+
PHP_REDIS_API int redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx, SuccessCallback success_callback);
56+
PHP_REDIS_API int redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
57+
PHP_REDIS_API int redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
58+
PHP_REDIS_API int redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
5959
PHP_REDIS_API void redis_single_line_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
6060
zval *z_tab, void *ctx);
61-
PHP_REDIS_API void redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
62-
PHP_REDIS_API void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
61+
PHP_REDIS_API int redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
62+
PHP_REDIS_API int redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
6363
PHP_REDIS_API void redis_parse_info_response(char *response, zval *z_ret);
6464
PHP_REDIS_API void redis_parse_client_list_response(char *response, zval *z_ret);
65-
PHP_REDIS_API void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
65+
PHP_REDIS_API int redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
6666
PHP_REDIS_API RedisSock* redis_sock_create(char *host, int host_len, int port, double timeout, double read_timeout, int persistent, char *persistent_id, long retry_interval);
6767
PHP_REDIS_API int redis_sock_connect(RedisSock *redis_sock);
6868
PHP_REDIS_API int redis_sock_server_open(RedisSock *redis_sock);
@@ -149,7 +149,7 @@ PHP_REDIS_API int redis_read_multibulk_recursive(RedisSock *redis_sock, long lon
149149
PHP_REDIS_API int redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
150150
PHP_REDIS_API int redis_read_raw_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
151151
PHP_REDIS_API int redis_read_variant_reply_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
152-
PHP_REDIS_API void redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
152+
PHP_REDIS_API int redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
153153

154154
/* Helper methods to get configuration values from a HashTable. */
155155

php_redis.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,6 @@ PHP_MINIT_FUNCTION(redis);
276276
PHP_MSHUTDOWN_FUNCTION(redis);
277277
PHP_MINFO_FUNCTION(redis);
278278

279-
/* Redis response handler function callback prototype */
280-
typedef void (*ResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
281-
282-
typedef int (*FailableResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock*, zval*, void*);
283-
284279
PHP_REDIS_API int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent);
285280

286281
PHP_REDIS_API int redis_response_enqueued(RedisSock *redis_sock);

0 commit comments

Comments
 (0)
0