#include <sys/stat.h>
#include <errno.h>
-#define MIN_FREE_MEMORY 64*1024
-
#define SHM_PROTECT() \
do { \
if (ZCG(accel_directives).protect_memory) { \
static void zend_accel_schedule_restart_if_necessary(TSRMLS_D)
{
if ((((double) ZSMMG(wasted_shared_memory)) / ZCG(accel_directives).memory_consumption) >= ZCG(accel_directives).max_wasted_percentage) {
+ ZSMMG(memory_exhausted) = 1;
zend_accel_schedule_restart(TSRMLS_C);
}
}
if (zend_accel_hash_is_full(&ZCSG(hash))) {
zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
ZSMMG(memory_exhausted) = 1;
+ zend_accel_schedule_restart(TSRMLS_C);
} else {
char *new_key = zend_shared_alloc(key_length + 1);
if (new_key) {
memcpy(new_key, key, key_length + 1);
zend_accel_hash_update(&ZCSG(hash), new_key, key_length + 1, 1, bucket);
- } else {
- zend_accel_error(ACCEL_LOG_DEBUG, "No more memory!");
- ZSMMG(memory_exhausted) = 1;
}
}
}
if (zend_accel_hash_is_full(&ZCSG(hash))) {
zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
ZSMMG(memory_exhausted) = 1;
- zend_accel_schedule_restart_if_necessary(TSRMLS_C);
+ zend_accel_schedule_restart(TSRMLS_C);
zend_shared_alloc_unlock(TSRMLS_C);
return new_persistent_script;
}
/* Allocate shared memory */
ZCG(mem) = zend_shared_alloc(memory_used);
if (!ZCG(mem)) {
- zend_accel_error(ACCEL_LOG_DEBUG, "No more memory!");
- zend_accel_schedule_restart_if_necessary(TSRMLS_C);
- if (zend_shared_alloc_get_largest_free_block() < MIN_FREE_MEMORY) {
- ZSMMG(memory_exhausted) = 1;
- }
zend_shared_alloc_unlock(TSRMLS_C);
return new_persistent_script;
}
if (!zend_accel_hash_update(&ZCSG(hash), key, key_length + 1, 1, bucket)) {
zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
ZSMMG(memory_exhausted) = 1;
+ zend_accel_schedule_restart(TSRMLS_C);
}
}
persistent_script->corrupted = 1;
persistent_script->timestamp = 0;
ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption;
+ zend_accel_schedule_restart_if_necessary(TSRMLS_C);
}
zend_shared_alloc_unlock(TSRMLS_C);
persistent_script = NULL;
persistent_script->corrupted = 1;
persistent_script->timestamp = 0;
ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption;
+ zend_accel_schedule_restart_if_necessary(TSRMLS_C);
}
zend_shared_alloc_unlock(TSRMLS_C);
persistent_script = NULL;
MAKE_STD_ZVAL(statistics);
array_init(statistics);
add_assoc_long(statistics, "num_cached_scripts", ZCSG(hash).num_direct_entries);
- add_assoc_long(statistics, "max_cached_scripts", ZCSG(hash).max_num_entries);
+ add_assoc_long(statistics, "num_cached_keys", ZCSG(hash).num_entries);
+ add_assoc_long(statistics, "max_cached_keys", ZCSG(hash).max_num_entries);
add_assoc_long(statistics, "hits", ZCSG(hits));
add_assoc_long(statistics, "last_restart_time", ZCSG(last_restart_time));
add_assoc_long(statistics, "misses", ZSMMG(memory_exhausted)?ZCSG(misses):ZCSG(misses)-ZCSG(blacklist_misses));
#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)
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;