@@ -74,13 +74,6 @@ typedef void (*execute_internal_func_t) (
74
74
);
75
75
76
76
static struct {
77
- #if ZEND_MODULE_API_NO >= 20151012
78
- void * (* malloc ) (size_t size );
79
- void (* free ) (void * ptr );
80
- void * (* realloc ) (void * ptr , size_t size );
81
- size_t (* block_size ) (void * ptr );
82
- #endif
83
-
84
77
#if ZEND_MODULE_API_NO < 20121212
85
78
void (* execute ) (zend_op_array * op_array TSRMLS_DC );
86
79
#else
@@ -124,9 +117,6 @@ static struct {
124
117
#endif
125
118
);
126
119
} ze_hooked_func = {
127
- #if ZEND_MODULE_API_NO >= 20151012
128
- NULL , NULL , NULL , NULL ,
129
- #endif
130
120
NULL , NULL , NULL ,
131
121
NULL , NULL ,
132
122
#if ZEND_MODULE_API_NO >= 20151012
@@ -135,6 +125,17 @@ static struct {
135
125
NULL
136
126
};
137
127
128
+ #if ZEND_MODULE_API_NO >= 20151012
129
+ static SPX_THREAD_TLS struct {
130
+ void * (* malloc ) (size_t size );
131
+ void (* free ) (void * ptr );
132
+ void * (* realloc ) (void * ptr , size_t size );
133
+ size_t (* block_size ) (void * ptr );
134
+ } ze_tls_hooked_func = {
135
+ NULL , NULL , NULL , NULL
136
+ };
137
+ #endif
138
+
138
139
static SPX_THREAD_TLS struct {
139
140
struct {
140
141
struct {
@@ -664,24 +665,28 @@ void spx_php_execution_init(void)
664
665
#if ZEND_MODULE_API_NO >= 20151012
665
666
zend_mm_heap * ze_mm_heap = zend_mm_get_heap ();
666
667
668
+ /*
669
+ * FIXME document why we need ze_mm_custom_block_size instead of ze_mm_block_size
670
+ * when there is no previous MM custom handler.
671
+ */
672
+ ze_tls_hooked_func .block_size = ze_mm_custom_block_size ;
673
+
667
674
zend_mm_get_custom_handlers (
668
675
ze_mm_heap ,
669
- & ze_hooked_func .malloc ,
670
- & ze_hooked_func .free ,
671
- & ze_hooked_func .realloc
676
+ & ze_tls_hooked_func .malloc ,
677
+ & ze_tls_hooked_func .free ,
678
+ & ze_tls_hooked_func .realloc
672
679
);
673
680
674
- ze_hooked_func .block_size = ze_mm_custom_block_size ;
675
-
676
681
if (
677
- !ze_hooked_func .malloc
678
- || !ze_hooked_func .free
679
- || !ze_hooked_func .realloc
682
+ !ze_tls_hooked_func .malloc
683
+ || !ze_tls_hooked_func .free
684
+ || !ze_tls_hooked_func .realloc
680
685
) {
681
- ze_hooked_func .malloc = ze_mm_malloc ;
682
- ze_hooked_func .free = ze_mm_free ;
683
- ze_hooked_func .realloc = ze_mm_realloc ;
684
- ze_hooked_func .block_size = ze_mm_block_size ;
686
+ ze_tls_hooked_func .malloc = ze_mm_malloc ;
687
+ ze_tls_hooked_func .free = ze_mm_free ;
688
+ ze_tls_hooked_func .realloc = ze_mm_realloc ;
689
+ ze_tls_hooked_func .block_size = ze_mm_block_size ;
685
690
}
686
691
687
692
zend_mm_set_custom_handlers (
@@ -697,24 +702,24 @@ void spx_php_execution_shutdown(void)
697
702
{
698
703
#if ZEND_MODULE_API_NO >= 20151012
699
704
if (
700
- ze_hooked_func .malloc
701
- && ze_hooked_func .free
702
- && ze_hooked_func .realloc
705
+ ze_tls_hooked_func .malloc
706
+ && ze_tls_hooked_func .free
707
+ && ze_tls_hooked_func .realloc
703
708
) {
704
709
zend_mm_heap * ze_mm_heap = zend_mm_get_heap ();
705
710
706
711
if (
707
712
/*
708
- * ze_hooked_func .malloc was defaulted to ze_mm_malloc only if there were no
713
+ * ze_tls_hooked_func .malloc was defaulted to ze_mm_malloc only if there were no
709
714
* previous custom handlers.
710
715
*/
711
- ze_hooked_func .malloc != ze_mm_malloc
716
+ ze_tls_hooked_func .malloc != ze_mm_malloc
712
717
) {
713
718
zend_mm_set_custom_handlers (
714
719
ze_mm_heap ,
715
- ze_hooked_func .malloc ,
716
- ze_hooked_func .free ,
717
- ze_hooked_func .realloc
720
+ ze_tls_hooked_func .malloc ,
721
+ ze_tls_hooked_func .free ,
722
+ ze_tls_hooked_func .realloc
718
723
);
719
724
} else {
720
725
/*
@@ -733,9 +738,10 @@ void spx_php_execution_shutdown(void)
733
738
}
734
739
}
735
740
736
- ze_hooked_func .malloc = NULL ;
737
- ze_hooked_func .free = NULL ;
738
- ze_hooked_func .realloc = NULL ;
741
+ ze_tls_hooked_func .malloc = NULL ;
742
+ ze_tls_hooked_func .free = NULL ;
743
+ ze_tls_hooked_func .realloc = NULL ;
744
+ ze_tls_hooked_func .block_size = NULL ;
739
745
}
740
746
#endif
741
747
@@ -1013,11 +1019,11 @@ static void * ze_mm_realloc(void * ptr, size_t size)
1013
1019
1014
1020
static void * tls_hook_malloc (size_t size )
1015
1021
{
1016
- void * ptr = ze_hooked_func .malloc (size );
1022
+ void * ptr = ze_tls_hooked_func .malloc (size );
1017
1023
1018
1024
if (ptr ) {
1019
1025
context .alloc_count ++ ;
1020
- context .alloc_bytes += ze_hooked_func .block_size (ptr );
1026
+ context .alloc_bytes += ze_tls_hooked_func .block_size (ptr );
1021
1027
}
1022
1028
1023
1029
return ptr ;
@@ -1027,17 +1033,17 @@ static void tls_hook_free(void * ptr)
1027
1033
{
1028
1034
if (ptr ) {
1029
1035
context .free_count ++ ;
1030
- context .free_bytes += ze_hooked_func .block_size (ptr );
1036
+ context .free_bytes += ze_tls_hooked_func .block_size (ptr );
1031
1037
}
1032
1038
1033
- ze_hooked_func .free (ptr );
1039
+ ze_tls_hooked_func .free (ptr );
1034
1040
}
1035
1041
1036
1042
static void * tls_hook_realloc (void * ptr , size_t size )
1037
1043
{
1038
- const size_t old_size = ptr ? ze_hooked_func .block_size (ptr ) : 0 ;
1039
- void * new = ze_hooked_func .realloc (ptr , size );
1040
- const size_t new_size = new ? ze_hooked_func .block_size (new ) : 0 ;
1044
+ const size_t old_size = ptr ? ze_tls_hooked_func .block_size (ptr ) : 0 ;
1045
+ void * new = ze_tls_hooked_func .realloc (ptr , size );
1046
+ const size_t new_size = new ? ze_tls_hooked_func .block_size (new ) : 0 ;
1041
1047
1042
1048
if (ptr && new ) {
1043
1049
if (ptr != new ) {
0 commit comments