22
22
#include "zend_stat.h"
23
23
#include "zend_stat_arena.h"
24
24
25
+ #ifndef ZEND_STAT_ARENA_DEBUG
26
+ # define ZEND_STAT_ARENA_DEBUG 0
27
+ #endif
28
+
25
29
typedef struct _zend_stat_arena_block_t zend_stat_arena_block_t ;
26
30
27
31
typedef intptr_t zend_stat_arena_ptr_t ;
28
32
29
33
struct _zend_stat_arena_block_t {
30
34
zend_long size ;
31
- zend_bool used ;
35
+ zend_long used ;
32
36
zend_stat_arena_block_t * next ;
33
37
zend_stat_arena_ptr_t mem [1 ];
34
38
};
@@ -70,15 +74,13 @@ static zend_always_inline zend_stat_arena_block_t* zend_stat_arena_find(zend_sta
70
74
while (NULL != block ) {
71
75
if ((0 == block -> used )) {
72
76
if ((block -> size >= size )) {
73
- block -> used = 1 ;
74
77
goto _zend_stat_arena_found ;
75
78
} else {
76
79
if (NULL != block -> next ) {
77
80
if ((0 == block -> next -> used ) &&
78
81
((block -> size + block -> next -> size ) >= size )) {
79
82
block -> size += block -> next -> size ;
80
83
block -> next = block -> next -> next ;
81
- block -> used = 1 ;
82
84
goto _zend_stat_arena_found ;
83
85
}
84
86
}
@@ -91,8 +93,7 @@ static zend_always_inline zend_stat_arena_block_t* zend_stat_arena_find(zend_sta
91
93
return NULL ;
92
94
93
95
_zend_stat_arena_found :
94
- if ((NULL != block ) &&
95
- ((wasted = (block -> size - size )) > 0 )) {
96
+ if (((wasted = (block -> size - size )) > 0 )) {
96
97
if ((wasted > ZEND_STAT_ARENA_BLOCK_MIN )) {
97
98
zend_stat_arena_block_t * reclaim =
98
99
(zend_stat_arena_block_t * )
@@ -108,6 +109,7 @@ static zend_always_inline zend_stat_arena_block_t* zend_stat_arena_find(zend_sta
108
109
109
110
block -> size = size ;
110
111
}
112
+ block -> used = size ;
111
113
112
114
return block ;
113
115
}
@@ -175,8 +177,8 @@ void* zend_stat_arena_alloc(zend_stat_arena_t *arena, zend_long size) {
175
177
goto _zend_stat_arena_alloc_oom ;
176
178
}
177
179
178
- block -> used = 1 ;
179
- block -> size = aligned ;
180
+ block -> used =
181
+ block -> size = aligned ;
180
182
181
183
if (UNEXPECTED (NULL == arena -> list .start )) {
182
184
arena -> list .start = block ;
@@ -199,7 +201,7 @@ void* zend_stat_arena_alloc(zend_stat_arena_t *arena, zend_long size) {
199
201
return NULL ;
200
202
}
201
203
202
- #ifdef ZEND_DEBUG
204
+ #if ZEND_STAT_ARENA_DEBUG
203
205
static zend_always_inline zend_bool zend_stat_arena_owns (zend_stat_arena_t * arena , void * mem ) {
204
206
if (UNEXPECTED ((((char * ) mem ) < ((char * ) arena )) || (((char * ) mem ) > arena -> end ))) {
205
207
return 0 ;
@@ -212,7 +214,7 @@ static zend_always_inline zend_bool zend_stat_arena_owns(zend_stat_arena_t *aren
212
214
void zend_stat_arena_free (zend_stat_arena_t * arena , void * mem ) {
213
215
zend_stat_arena_block_t * block = zend_stat_arena_block (mem );
214
216
215
- #ifdef ZEND_DEBUG
217
+ #if ZEND_STAT_ARENA_DEBUG
216
218
ZEND_ASSERT (zend_stat_arena_owns (arena , mem ));
217
219
#endif
218
220
@@ -239,18 +241,25 @@ void zend_stat_arena_free(zend_stat_arena_t *arena, void *mem) {
239
241
pthread_mutex_unlock (& arena -> mutex );
240
242
}
241
243
242
- #ifdef ZEND_DEBUG
244
+ #if ZEND_STAT_ARENA_DEBUG
243
245
static zend_always_inline void zend_stat_arena_debug (zend_stat_arena_t * arena ) {
244
246
zend_stat_arena_block_t * block = arena -> list .start ;
247
+ zend_long wasted = 0 ;
245
248
246
249
while (NULL != block ) {
247
- if (block -> used ) {
250
+ if (block -> used > 0 ) {
251
+ wasted += block -> size - block -> used ;
252
+ }
253
+
254
+ if (block -> used > 0 ) {
248
255
fprintf (stderr ,
249
- "[STAT] %p leaked " ZEND_LONG_FMT " bytes\n" ,
250
- block -> mem , block -> size );
256
+ "[STAT] %p leaked %p " ZEND_LONG_FMT " bytes\n" ,
257
+ arena , block -> mem , block -> size );
251
258
}
252
259
block = block -> next ;
253
260
}
261
+
262
+ fprintf (stderr , "[STAT] %p wasted " ZEND_LONG_FMT " bytes\n" , arena , wasted );
254
263
}
255
264
#endif
256
265
@@ -259,7 +268,7 @@ void zend_stat_arena_destroy(zend_stat_arena_t *arena) {
259
268
return ;
260
269
}
261
270
262
- #ifdef ZEND_DEBUG
271
+ #if ZEND_STAT_ARENA_DEBUG
263
272
zend_stat_arena_debug (arena );
264
273
#endif
265
274
0 commit comments