33
33
#include <fcntl.h>
34
34
35
35
#define HASH_TABLE_NAME "cfc_hash"
36
- #define BUFFER_SIZE 4096
36
+ #define BUFFER_SIZE 1024
37
37
38
38
/* If you declare any globals in php_cfc.h uncomment this:
39
39
ZEND_DECLARE_MODULE_GLOBALS(cfc)
@@ -211,7 +211,7 @@ int redis_incr(char *func)
211
211
return redis_incr (func );
212
212
}
213
213
}
214
- freeReplyObject (reply );
214
+ freeReplyObject (reply );
215
215
return r ;
216
216
}
217
217
@@ -225,11 +225,11 @@ int set_nonblocking(int fd)
225
225
return 0 ;
226
226
}
227
227
228
- static char * get_function_name (zend_execute_data * execute_data )
228
+ static char * get_function_name (zend_execute_data * execute_data , size_t * output_len )
229
229
{
230
230
zend_execute_data * data ;
231
231
char * ret = NULL ;
232
- int len ;
232
+ size_t len ;
233
233
const char * cls ;
234
234
const char * func ;
235
235
zend_function * curr_func ;
@@ -252,14 +252,18 @@ static char *get_function_name(zend_execute_data * execute_data)
252
252
data -> called_scope -> name -> val : NULL );
253
253
if (cls )
254
254
{
255
- len = strlen (cls ) + strlen (func ) + 10 ;
256
- ret = (char * ) emalloc (len );
257
- snprintf (ret , len , "%s::%s" , cls , func );
255
+ len = strlen (cls ) + strlen (func ) + strlen ("::" ) + 1 ;
256
+ ret = (char * ) emalloc (len + sizeof (size_t ));
257
+ memcpy (ret , & len , sizeof (size_t ));
258
+ sprintf (ret + sizeof (size_t ), "%s::%s" , cls , func );
259
+ * output_len = len + sizeof (size_t );
258
260
}
259
261
else
260
262
{
261
- ret = (char * ) emalloc (len );
262
- snprintf (ret , len , "%s" , func );
263
+ ret = (char * ) emalloc (len + sizeof (size_t ));
264
+ memcpy (ret , & len , sizeof (size_t ));
265
+ sprintf (ret + sizeof (size_t ), "%s" , func );
266
+ * output_len = len + sizeof (size_t );
263
267
}
264
268
}
265
269
else
@@ -291,12 +295,12 @@ static char *get_function_name(zend_execute_data * execute_data)
291
295
return ret ;
292
296
}
293
297
294
- static void push_func_to_queue (char * func )
298
+ static void push_func_to_queue (char * func , size_t len )
295
299
{
296
300
if (NULL == func ) {
297
301
return ;
298
302
}
299
- write (manager_ptr -> queues [1 ], func , strlen ( func ) + 1 );
303
+ write (manager_ptr -> queues [1 ], func , len );
300
304
}
301
305
302
306
static void my_zend_execute_ex (zend_execute_data * execute_data )
@@ -305,20 +309,21 @@ static void my_zend_execute_ex(zend_execute_data *execute_data)
305
309
goto end ;
306
310
}
307
311
char * func = NULL ;
308
- func = get_function_name (execute_data TSRMLS_CC );
312
+ size_t len ;
313
+ func = get_function_name (execute_data , & len );
309
314
if (!func ) {
310
315
goto end ;
311
316
}
312
317
if (cfc_prefixs .count ) {
313
318
for (int i = 0 ; i < cfc_prefixs .count ; i ++ ) {
314
- if (strncmp (cfc_prefixs .val [i ], func , strlen (cfc_prefixs .val [i ])) == 0 ) {
315
- push_func_to_queue (func );
319
+ if (strncmp (cfc_prefixs .val [i ], func + sizeof ( size_t ) , strlen (cfc_prefixs .val [i ])) == 0 ) {
320
+ push_func_to_queue (func , len );
316
321
}
317
322
}
318
323
} else {
319
- push_func_to_queue (func );
324
+ push_func_to_queue (func , len );
320
325
}
321
- efree (func );
326
+ efree (func );
322
327
end :
323
328
old_zend_execute_ex (execute_data TSRMLS_CC ) ;
324
329
}
@@ -353,7 +358,6 @@ void *cfc_thread_worker(void *arg)
353
358
break ;
354
359
}
355
360
356
- /* Get item from worker queue */
357
361
spin_lock (& manager_ptr -> qlock );
358
362
359
363
item = manager_ptr -> head ;
@@ -389,8 +393,7 @@ void *cfc_thread_queue(void *arg)
389
393
CFC_LOG_DEBUG ("Queue thread started" );
390
394
fd_set read_set ;
391
395
int queue = manager_ptr -> queues [0 ];
392
- char read_buf [BUFFER_SIZE ], * read_buf_ptr = read_buf ;;
393
- char unfinished [BUFFER_SIZE ];
396
+ char read_buf [BUFFER_SIZE ];
394
397
for (;;) {
395
398
396
399
FD_ZERO (& read_set );
@@ -404,73 +407,54 @@ void *cfc_thread_queue(void *arg)
404
407
continue ;
405
408
}
406
409
410
+ #define check_read_result (r ) \
411
+ if (r == -1) { \
412
+ break; \
413
+ } \
414
+ if (r == 0) { \
415
+ pthread_exit(0); \
416
+ }
417
+
407
418
if (FD_ISSET (queue , & read_set )) {
408
- int len ;
409
419
char * offset ;
410
- memset (unfinished , 0 , BUFFER_SIZE );
420
+ size_t len ;
421
+ int r ;
411
422
for (;;) {
412
423
memset (read_buf , 0 , BUFFER_SIZE );
413
- if (strlen (unfinished )) {
414
- strcpy (read_buf_ptr , unfinished );
415
- len = read (queue , read_buf_ptr + strlen (unfinished ), BUFFER_SIZE - strlen (unfinished ));
416
- memset (unfinished , 0 , BUFFER_SIZE );
417
- } else {
418
- len = read (queue , read_buf_ptr , BUFFER_SIZE );
419
- }
420
- if (len == -1 ) {
424
+ r = read (queue , & len , sizeof (size_t ));
425
+ check_read_result (r );
426
+ r = read (queue , read_buf , len );
427
+ check_read_result (r );
428
+ if (r != len ) {
429
+ CFC_LOG_WARN ("read failure" );
421
430
break ;
422
431
}
423
-
424
- if (len == 0 ) {
425
- pthread_exit (0 );
432
+ cfc_item_t * item ;
433
+ item = (cfc_item_t * )pemalloc (sizeof (* item ) + len , 1 );
434
+ if (!item ) {
435
+ CFC_LOG_WARN ("Memory malloc failure" );
436
+ continue ;
426
437
}
427
- offset = read_buf ;
428
- if (offset [len - 1 ] != '\0' ) { /* 有未读完的数据 */
429
- int i = 1 ;
430
- while (1 ) {
431
- if (i >= len ) {
432
- memcpy (unfinished , offset , len );
433
- break ;
434
- }
435
- if (* (offset + len - 1 - i ) == '\0' ) {
436
- memcpy (unfinished , offset + len - i , i - 1 );
437
- memset (offset + len - i , 0 , 1 );
438
- break ;
439
- }
440
- i ++ ;
441
- }
438
+
439
+ item -> size = len ;
440
+ item -> next = NULL ;
441
+ memcpy (item -> buffer , read_buf , len );
442
+
443
+ spin_lock (& manager_ptr -> qlock );
444
+
445
+ if (!manager_ptr -> head ) {
446
+ manager_ptr -> head = item ;
442
447
}
443
- while (strlen (offset )) {
444
- int offset_len = strlen (offset );
445
- cfc_item_t * item ;
446
- int length = 0 ;
447
- length = sizeof (* item ) + offset_len + 1 ;
448
- item = (cfc_item_t * )pemalloc (length , 1 );
449
- if (!item ) {
450
- CFC_LOG_WARN ("Memory malloc failure" );
451
- continue ;
452
- }
453
- item -> size = offset_len + 1 ;
454
- item -> next = NULL ;
455
- memcpy (item -> buffer , offset , offset_len + 1 );
456
-
457
- spin_lock (& manager_ptr -> qlock );
458
-
459
- if (!manager_ptr -> head ) {
460
- manager_ptr -> head = item ;
461
- }
462
-
463
- if (manager_ptr -> tail ) {
464
- manager_ptr -> tail -> next = item ;
465
- }
466
-
467
- manager_ptr -> tail = item ;
468
-
469
- spin_unlock (& manager_ptr -> qlock );
470
- /* notify worker thread */
471
- write (manager_ptr -> notifiers [1 ], "\0" , 1 );
472
- offset = offset + offset_len + 1 ;
448
+
449
+ if (manager_ptr -> tail ) {
450
+ manager_ptr -> tail -> next = item ;
473
451
}
452
+
453
+ manager_ptr -> tail = item ;
454
+
455
+ spin_unlock (& manager_ptr -> qlock );
456
+ /* notify worker thread */
457
+ write (manager_ptr -> notifiers [1 ], "\0" , 1 );
474
458
}
475
459
}
476
460
}
0 commit comments