diff options
Diffstat (limited to 'zend_shared_alloc.c')
| -rw-r--r-- | zend_shared_alloc.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/zend_shared_alloc.c b/zend_shared_alloc.c index b6040cf0ad..1a983aeea7 100644 --- a/zend_shared_alloc.c +++ b/zend_shared_alloc.c @@ -256,10 +256,29 @@ void zend_shared_alloc_shutdown(void) #endif } +static size_t zend_shared_alloc_get_largest_free_block(void) +{ + int i; + size_t largest_block_size = 0; + + for (i = 0; i < ZSMMG(shared_segments_count); i++) { + size_t block_size = ZSMMG(shared_segments)[i]->size - ZSMMG(shared_segments)[i]->pos; + + if (block_size>largest_block_size) { + largest_block_size = block_size; + } + } + return largest_block_size; +} + +#define MIN_FREE_MEMORY 64*1024 + #define SHARED_ALLOC_FAILED() do { \ zend_accel_error(ACCEL_LOG_WARNING, "Not enough free shared space to allocate %ld bytes (%ld bytes free)", (long)size, (long)ZSMMG(shared_free)); \ - ZSMMG(memory_exhausted) = 1; \ - zend_accel_schedule_restart(TSRMLS_C); \ + if (zend_shared_alloc_get_largest_free_block() < MIN_FREE_MEMORY) { \ + ZSMMG(memory_exhausted) = 1; \ + zend_accel_schedule_restart(TSRMLS_C); \ + } \ } while (0) void *zend_shared_alloc(size_t size) @@ -425,21 +444,6 @@ size_t zend_shared_alloc_get_free_memory(void) return ZSMMG(shared_free); } -size_t zend_shared_alloc_get_largest_free_block(void) -{ - int i; - size_t largest_block_size = 0; - - for (i = 0; i < ZSMMG(shared_segments_count); i++) { - size_t block_size = ZSMMG(shared_segments)[i]->size - ZSMMG(shared_segments)[i]->pos; - - if (block_size>largest_block_size) { - largest_block_size = block_size; - } - } - return largest_block_size; -} - void zend_shared_alloc_save_state(void) { int i; |
