31
31
#include "conf.h"
32
32
#include "topic_partition.h"
33
33
#include "message.h"
34
+ #include "zeval.h"
34
35
35
36
zend_class_entry * ce_kafka_conf ;
36
37
zend_class_entry * ce_kafka_topic_conf ;
37
38
39
+ static zend_object_handlers handlers ;
40
+
38
41
static void kafka_conf_callback_dtor (kafka_conf_callback * cb TSRMLS_DC ) /* {{{ */
39
42
{
40
- if (cb -> fci . function_name ) {
43
+ if (cb ) {
41
44
zval_ptr_dtor (& cb -> fci .function_name );
45
+ efree (cb );
42
46
}
43
47
} /* }}} */
44
48
45
49
void kafka_conf_callbacks_dtor (kafka_conf_callbacks * cbs TSRMLS_DC ) /* {{{ */
46
50
{
47
- kafka_conf_callback_dtor (& cbs -> error TSRMLS_CC );
48
- kafka_conf_callback_dtor (& cbs -> rebalance TSRMLS_CC );
49
- kafka_conf_callback_dtor (& cbs -> dr_msg TSRMLS_CC );
51
+ kafka_conf_callback_dtor (cbs -> error TSRMLS_CC );
52
+ kafka_conf_callback_dtor (cbs -> rebalance TSRMLS_CC );
53
+ kafka_conf_callback_dtor (cbs -> dr_msg TSRMLS_CC );
50
54
} /* }}} */
51
55
52
- static void kafka_conf_callback_copy (kafka_conf_callback * to , kafka_conf_callback * from TSRMLS_DC ) /* {{{ */
56
+ static void kafka_conf_callback_copy (kafka_conf_callback * * to , kafka_conf_callback * from TSRMLS_DC ) /* {{{ */
53
57
{
54
- * to = * from ;
55
- if (to -> fci .function_name ) {
56
- Z_ADDREF_P (to -> fci .function_name );
58
+ if (from ) {
59
+ * to = emalloc (sizeof (* * to ));
60
+ * * to = * from ;
61
+ #if PHP_MAJOR_VERSION >= 7
62
+ zval_copy_ctor (& (* to )-> fci .function_name );
63
+ #else
64
+ Z_ADDREF_P ((* to )-> fci .function_name );
65
+ #endif
57
66
}
58
67
} /* }}} */
59
68
60
69
void kafka_conf_callbacks_copy (kafka_conf_callbacks * to , kafka_conf_callbacks * from TSRMLS_DC ) /* {{{ */
61
70
{
62
- kafka_conf_callback_copy (& to -> error , & from -> error TSRMLS_CC );
63
- kafka_conf_callback_copy (& to -> rebalance , & from -> rebalance TSRMLS_CC );
64
- kafka_conf_callback_copy (& to -> dr_msg , & from -> dr_msg TSRMLS_CC );
71
+ kafka_conf_callback_copy (& to -> error , from -> error TSRMLS_CC );
72
+ kafka_conf_callback_copy (& to -> rebalance , from -> rebalance TSRMLS_CC );
73
+ kafka_conf_callback_copy (& to -> dr_msg , from -> dr_msg TSRMLS_CC );
65
74
} /* }}} */
66
75
67
- static void kafka_conf_free (void * object TSRMLS_DC ) /* {{{ */
76
+ static void kafka_conf_free (zend_object * object TSRMLS_DC ) /* {{{ */
68
77
{
69
- kafka_conf_object * intern = (kafka_conf_object * ) object ;
78
+ kafka_conf_object * intern = get_custom_object (kafka_conf_object , object ) ;
70
79
71
80
switch (intern -> type ) {
72
81
case KAFKA_CONF :
@@ -84,7 +93,7 @@ static void kafka_conf_free(void *object TSRMLS_DC) /* {{{ */
84
93
85
94
zend_object_std_dtor (& intern -> std TSRMLS_CC );
86
95
87
- efree (intern );
96
+ free_custom_object (intern );
88
97
}
89
98
/* }}} */
90
99
@@ -97,8 +106,8 @@ static zend_object_value kafka_conf_new(zend_class_entry *class_type TSRMLS_DC)
97
106
zend_object_std_init (& intern -> std , class_type TSRMLS_CC );
98
107
object_properties_init (& intern -> std , class_type );
99
108
100
- retval . handle = zend_objects_store_put ( & intern -> std , (zend_objects_store_dtor_t ) zend_objects_destroy_object , kafka_conf_free , NULL TSRMLS_CC );
101
- retval . handlers = & kafka_object_handlers ;
109
+ STORE_OBJECT ( retval , intern , (zend_objects_store_dtor_t ) zend_objects_destroy_object , kafka_conf_free , NULL );
110
+ SET_OBJECT_HANDLERS ( retval , & handlers ) ;
102
111
103
112
return retval ;
104
113
}
@@ -119,131 +128,86 @@ kafka_conf_object * get_kafka_conf_object(zval *zconf TSRMLS_DC)
119
128
static void kafka_conf_error_cb (rd_kafka_t * rk , int err , const char * reason , void * opaque )
120
129
{
121
130
kafka_conf_callbacks * cbs = (kafka_conf_callbacks * ) opaque ;
122
- zval * retval ;
123
- zval * * args [3 ];
124
- zval * zrk ;
125
- zval * zerr ;
126
- zval * zreason ;
131
+ zeval args [3 ];
127
132
TSRMLS_FETCH ();
128
133
129
134
if (!opaque ) {
130
135
return ;
131
136
}
132
137
133
- if (!cbs -> error . fci . function_name ) {
138
+ if (!cbs -> error ) {
134
139
return ;
135
140
}
136
141
137
- ALLOC_INIT_ZVAL (zrk );
138
- KAFKA_ZVAL_ZVAL (zrk , & cbs -> rk , 1 , 0 );
139
-
140
- ALLOC_INIT_ZVAL (zerr );
141
- ZVAL_LONG (zerr , err );
142
-
143
- ALLOC_INIT_ZVAL (zreason );
144
- ZVAL_STRING (zreason , reason , 1 );
142
+ MAKE_STD_ZEVAL (args [0 ]);
143
+ MAKE_STD_ZEVAL (args [1 ]);
144
+ MAKE_STD_ZEVAL (args [2 ]);
145
145
146
- args [0 ] = & zrk ;
147
- args [1 ] = & zerr ;
148
- args [2 ] = & zreason ;
146
+ KAFKA_ZVAL_ZVAL ( P_ZEVAL ( args [0 ]), & cbs -> rk , 1 , 0 ) ;
147
+ ZVAL_LONG ( P_ZEVAL ( args [1 ]), err ) ;
148
+ RDKAFKA_ZVAL_STRING ( P_ZEVAL ( args [2 ]), reason ) ;
149
149
150
- cbs -> error .fci .retval_ptr_ptr = & retval ;
151
- cbs -> error .fci .params = args ;
152
- cbs -> error .fci .param_count = 3 ;
150
+ rdkafka_call_function (& cbs -> error -> fci , & cbs -> error -> fcc , NULL , 3 , args TSRMLS_CC );
153
151
154
- zend_call_function (& cbs -> error .fci , & cbs -> error .fcc TSRMLS_CC );
155
-
156
- if (retval ) {
157
- zval_ptr_dtor (& retval );
158
- }
159
- zval_ptr_dtor (& zrk );
160
- zval_ptr_dtor (& zerr );
161
- zval_ptr_dtor (& zreason );
152
+ zval_ptr_dtor (& args [0 ]);
153
+ zval_ptr_dtor (& args [1 ]);
154
+ zval_ptr_dtor (& args [2 ]);
162
155
}
163
156
164
157
static void kafka_conf_dr_msg_cb (rd_kafka_t * rk , const rd_kafka_message_t * msg , void * opaque )
165
158
{
166
159
kafka_conf_callbacks * cbs = (kafka_conf_callbacks * ) opaque ;
167
- zval * retval ;
168
- zval * * args [2 ];
169
- zval * zrk ;
170
- zval * zrkmsg ;
160
+ zeval args [2 ];
171
161
TSRMLS_FETCH ();
172
162
173
163
if (!opaque ) {
174
164
return ;
175
165
}
176
166
177
- if (!cbs -> dr_msg . fci . function_name ) {
167
+ if (!cbs -> dr_msg ) {
178
168
return ;
179
169
}
180
170
181
- ALLOC_INIT_ZVAL (zrk );
182
- KAFKA_ZVAL_ZVAL (zrk , & cbs -> rk , 1 , 0 );
183
-
184
- ALLOC_INIT_ZVAL (zrkmsg );
185
- kafka_message_new (zrkmsg , msg TSRMLS_CC );
171
+ MAKE_STD_ZEVAL (args [0 ]);
172
+ MAKE_STD_ZEVAL (args [1 ]);
186
173
187
- args [0 ] = & zrk ;
188
- args [1 ] = & zrkmsg ;
174
+ KAFKA_ZVAL_ZVAL ( P_ZEVAL ( args [0 ]), & cbs -> rk , 1 , 0 ) ;
175
+ kafka_message_new ( P_ZEVAL ( args [1 ]), msg TSRMLS_CC ) ;
189
176
190
- cbs -> dr_msg .fci .retval_ptr_ptr = & retval ;
191
- cbs -> dr_msg .fci .params = args ;
192
- cbs -> dr_msg .fci .param_count = 2 ;
177
+ rdkafka_call_function (& cbs -> dr_msg -> fci , & cbs -> dr_msg -> fcc , NULL , 2 , args TSRMLS_CC );
193
178
194
- zend_call_function (& cbs -> dr_msg .fci , & cbs -> dr_msg .fcc TSRMLS_CC );
195
-
196
- if (retval ) {
197
- zval_ptr_dtor (& retval );
198
- }
199
- zval_ptr_dtor (& zrk );
200
- zval_ptr_dtor (& zrkmsg );
179
+ zval_ptr_dtor (& args [0 ]);
180
+ zval_ptr_dtor (& args [1 ]);
201
181
}
202
182
203
183
#ifdef HAVE_NEW_KAFKA_CONSUMER
204
184
static void kafka_conf_rebalance_cb (rd_kafka_t * rk , rd_kafka_resp_err_t err , rd_kafka_topic_partition_list_t * partitions , void * opaque )
205
185
{
206
186
kafka_conf_callbacks * cbs = (kafka_conf_callbacks * ) opaque ;
207
- zval * retval ;
208
- zval * * args [3 ];
209
- zval * zrk ;
210
- zval * zerr ;
211
- zval * zpartitions ;
187
+ zeval args [3 ];
212
188
TSRMLS_FETCH ();
213
189
214
190
if (!opaque ) {
215
191
return ;
216
192
}
217
193
218
- if (!cbs -> rebalance . fci . function_name ) {
194
+ if (!cbs -> rebalance ) {
219
195
return ;
220
196
}
221
197
222
- ALLOC_INIT_ZVAL (zrk );
223
- KAFKA_ZVAL_ZVAL (zrk , & cbs -> rk , 1 , 0 );
224
-
225
- ALLOC_INIT_ZVAL (zerr );
226
- ZVAL_LONG (zerr , err );
227
-
228
- ALLOC_INIT_ZVAL (zpartitions );
229
- kafka_topic_partition_list_to_array (zpartitions , partitions TSRMLS_CC );
198
+ MAKE_STD_ZEVAL (args [0 ]);
199
+ MAKE_STD_ZEVAL (args [1 ]);
200
+ MAKE_STD_ZEVAL (args [2 ]);
230
201
231
- args [0 ] = & zrk ;
232
- args [1 ] = & zerr ;
233
- args [2 ] = & zpartitions ;
202
+ KAFKA_ZVAL_ZVAL ( P_ZEVAL ( args [0 ]), & cbs -> rk , 1 , 0 ) ;
203
+ ZVAL_LONG ( P_ZEVAL ( args [1 ]), err ) ;
204
+ kafka_topic_partition_list_to_array ( P_ZEVAL ( args [2 ]), partitions TSRMLS_CC ) ;
234
205
235
- cbs -> rebalance .fci .retval_ptr_ptr = & retval ;
236
- cbs -> rebalance .fci .params = args ;
237
- cbs -> rebalance .fci .param_count = 3 ;
206
+ rdkafka_call_function (& cbs -> rebalance -> fci , & cbs -> rebalance -> fcc , NULL , 3 , args TSRMLS_CC );
238
207
239
- zend_call_function (& cbs -> rebalance .fci , & cbs -> rebalance .fcc TSRMLS_CC );
240
-
241
- if (retval ) {
242
- zval_ptr_dtor (& retval );
243
- }
244
- zval_ptr_dtor (& zrk );
245
- zval_ptr_dtor (& zerr );
246
- zval_ptr_dtor (& zpartitions );
208
+ zval_ptr_dtor (& args [0 ]);
209
+ zval_ptr_dtor (& args [1 ]);
210
+ zval_ptr_dtor (& args [2 ]);
247
211
}
248
212
#endif /* HAVE_NEW_KAFKA_CONSUMER */
249
213
@@ -310,7 +274,7 @@ PHP_METHOD(RdKafka__Conf, dump)
310
274
for (i = 0 ; i < cntp ; i += 2 ) {
311
275
const char * key = dump [i ];
312
276
const char * value = dump [i + 1 ];
313
- add_assoc_string (return_value , (char * )key , (char * )value , 1 );
277
+ rdkafka_add_assoc_string (return_value , (char * )key , (char * )value );
314
278
}
315
279
316
280
rd_kafka_conf_dump_free (dump , cntp );
@@ -328,9 +292,9 @@ ZEND_END_ARG_INFO()
328
292
PHP_METHOD (RdKafka__Conf , set )
329
293
{
330
294
char * name ;
331
- int name_len ;
295
+ arglen_t name_len ;
332
296
char * value ;
333
- int value_len ;
297
+ arglen_t value_len ;
334
298
kafka_conf_object * intern ;
335
299
rd_kafka_conf_res_t ret = 0 ;
336
300
char errstr [512 ];
@@ -425,14 +389,16 @@ PHP_METHOD(RdKafka__Conf, setErrorCb)
425
389
return ;
426
390
}
427
391
428
- Z_ADDREF_P (fci .function_name );
392
+ Z_ADDREF_P (P_ZEVAL ( fci .function_name ) );
429
393
430
- if (intern -> cbs .error .fci .function_name ) {
431
- zval_ptr_dtor (& intern -> cbs .error .fci .function_name );
394
+ if (intern -> cbs .error ) {
395
+ zval_ptr_dtor (& intern -> cbs .error -> fci .function_name );
396
+ } else {
397
+ intern -> cbs .error = ecalloc (1 , sizeof (* intern -> cbs .error ));
432
398
}
433
399
434
- intern -> cbs .error . fci = fci ;
435
- intern -> cbs .error . fcc = fcc ;
400
+ intern -> cbs .error -> fci = fci ;
401
+ intern -> cbs .error -> fcc = fcc ;
436
402
437
403
rd_kafka_conf_set_error_cb (intern -> u .conf , kafka_conf_error_cb );
438
404
}
@@ -460,14 +426,16 @@ PHP_METHOD(RdKafka__Conf, setDrMsgCb)
460
426
return ;
461
427
}
462
428
463
- Z_ADDREF_P (fci .function_name );
429
+ Z_ADDREF_P (P_ZEVAL ( fci .function_name ) );
464
430
465
- if (intern -> cbs .dr_msg .fci .function_name ) {
466
- zval_ptr_dtor (& intern -> cbs .dr_msg .fci .function_name );
431
+ if (intern -> cbs .dr_msg ) {
432
+ zval_ptr_dtor (& intern -> cbs .dr_msg -> fci .function_name );
433
+ } else {
434
+ intern -> cbs .dr_msg = ecalloc (1 , sizeof (* intern -> cbs .dr_msg ));
467
435
}
468
436
469
- intern -> cbs .dr_msg . fci = fci ;
470
- intern -> cbs .dr_msg . fcc = fcc ;
437
+ intern -> cbs .dr_msg -> fci = fci ;
438
+ intern -> cbs .dr_msg -> fcc = fcc ;
471
439
472
440
rd_kafka_conf_set_dr_msg_cb (intern -> u .conf , kafka_conf_dr_msg_cb );
473
441
}
@@ -496,14 +464,16 @@ PHP_METHOD(RdKafka__Conf, setRebalanceCb)
496
464
return ;
497
465
}
498
466
499
- Z_ADDREF_P (fci .function_name );
467
+ Z_ADDREF_P (P_ZEVAL ( fci .function_name ) );
500
468
501
- if (intern -> cbs .rebalance .fci .function_name ) {
502
- zval_ptr_dtor (& intern -> cbs .rebalance .fci .function_name );
469
+ if (intern -> cbs .rebalance ) {
470
+ zval_ptr_dtor (& intern -> cbs .rebalance -> fci .function_name );
471
+ } else {
472
+ intern -> cbs .rebalance = ecalloc (1 , sizeof (* intern -> cbs .rebalance ));
503
473
}
504
474
505
- intern -> cbs .rebalance . fci = fci ;
506
- intern -> cbs .rebalance . fcc = fcc ;
475
+ intern -> cbs .rebalance -> fci = fci ;
476
+ intern -> cbs .rebalance -> fcc = fcc ;
507
477
508
478
rd_kafka_conf_set_rebalance_cb (intern -> u .conf , kafka_conf_rebalance_cb );
509
479
}
@@ -597,6 +567,10 @@ void kafka_conf_minit(TSRMLS_D)
597
567
{
598
568
zend_class_entry tmpce ;
599
569
570
+ handlers = kafka_default_object_handlers ;
571
+ set_object_handler_free_obj (& handlers , kafka_conf_free );
572
+ set_object_handler_offset (& handlers , XtOffsetOf (kafka_conf_object , std ));
573
+
600
574
INIT_NS_CLASS_ENTRY (tmpce , "RdKafka" , "Conf" , kafka_conf_fe );
601
575
ce_kafka_conf = zend_register_internal_class (& tmpce TSRMLS_CC );
602
576
ce_kafka_conf -> create_object = kafka_conf_new ;
0 commit comments