mirror of
https://github.com/phpv8/v8js.git
synced 2024-12-22 12:51:52 +00:00
add V8Js::setAverageObjectSize method
This commit is contained in:
parent
770c9b2fca
commit
12903ca269
@ -142,6 +142,14 @@ class V8Js
|
|||||||
public function setMemoryLimit($limit)
|
public function setMemoryLimit($limit)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the average object size (in bytes) for this V8Js object.
|
||||||
|
* V8's "amount of external memory" is adjusted by this value for every exported object. V8 triggers a garbage collection once this totals to 192 MB.
|
||||||
|
* @param int $average_object_size
|
||||||
|
*/
|
||||||
|
public function setAverageObjectSize($average_object_size)
|
||||||
|
{}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns uncaught pending exception or null if there is no pending exception.
|
* Returns uncaught pending exception or null if there is no pending exception.
|
||||||
* @return V8JsScriptException|null
|
* @return V8JsScriptException|null
|
||||||
|
16
tests/set_average_object_size_basic.phpt
Normal file
16
tests/set_average_object_size_basic.phpt
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
--TEST--
|
||||||
|
Test V8::setAverageObjectSize() : Average object size can be set on V8Js object
|
||||||
|
--SKIPIF--
|
||||||
|
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$v8 = new V8Js();
|
||||||
|
$v8->setAverageObjectSize(32768);
|
||||||
|
|
||||||
|
// there's no API to query the currently announced external memory allocation,
|
||||||
|
// hence not much we can do here...
|
||||||
|
|
||||||
|
?>
|
||||||
|
===EOF===
|
||||||
|
--EXPECT--
|
||||||
|
===EOF===
|
@ -158,7 +158,7 @@ static void v8js_free_storage(void *object TSRMLS_DC) /* {{{ */
|
|||||||
it != c->weak_objects.end(); ++it) {
|
it != c->weak_objects.end(); ++it) {
|
||||||
zval *value = it->first;
|
zval *value = it->first;
|
||||||
zval_ptr_dtor(&value);
|
zval_ptr_dtor(&value);
|
||||||
c->isolate->AdjustAmountOfExternalAllocatedMemory(-1024);
|
c->isolate->AdjustAmountOfExternalAllocatedMemory(-c->average_object_size);
|
||||||
it->second.Reset();
|
it->second.Reset();
|
||||||
}
|
}
|
||||||
c->weak_objects.~map();
|
c->weak_objects.~map();
|
||||||
@ -254,6 +254,8 @@ static zend_object_value v8js_new(zend_class_entry *ce TSRMLS_DC) /* {{{ */
|
|||||||
new(&c->v8js_v8objects) std::list<v8js_v8object *>();
|
new(&c->v8js_v8objects) std::list<v8js_v8object *>();
|
||||||
new(&c->script_objects) std::vector<v8js_script *>();
|
new(&c->script_objects) std::vector<v8js_script *>();
|
||||||
|
|
||||||
|
c->average_object_size = 1024;
|
||||||
|
|
||||||
retval.handle = zend_objects_store_put(c, NULL, (zend_objects_free_object_storage_t) v8js_free_storage, NULL TSRMLS_CC);
|
retval.handle = zend_objects_store_put(c, NULL, (zend_objects_free_object_storage_t) v8js_free_storage, NULL TSRMLS_CC);
|
||||||
retval.handlers = &v8js_object_handlers;
|
retval.handlers = &v8js_object_handlers;
|
||||||
|
|
||||||
@ -899,6 +901,22 @@ static PHP_METHOD(V8Js, setMemoryLimit)
|
|||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
/* {{{ proto void V8Js::setAverageObjectSize(average_object_size)
|
||||||
|
*/
|
||||||
|
static PHP_METHOD(V8Js, setAverageObjectSize)
|
||||||
|
{
|
||||||
|
v8js_ctx *c;
|
||||||
|
long average_object_size = 0;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &average_object_size) == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = (v8js_ctx *) zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||||
|
c->average_object_size = average_object_size;
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
static void v8js_persistent_zval_ctor(zval **p) /* {{{ */
|
static void v8js_persistent_zval_ctor(zval **p) /* {{{ */
|
||||||
{
|
{
|
||||||
zval *orig_ptr = *p;
|
zval *orig_ptr = *p;
|
||||||
@ -1178,6 +1196,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_v8js_setmoduleloader, 0, 0, 1)
|
|||||||
ZEND_ARG_INFO(0, callable)
|
ZEND_ARG_INFO(0, callable)
|
||||||
ZEND_END_ARG_INFO()
|
ZEND_END_ARG_INFO()
|
||||||
|
|
||||||
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8js_setaverageobjectsize, 0, 0, 1)
|
||||||
|
ZEND_ARG_INFO(0, average_object_size)
|
||||||
|
ZEND_END_ARG_INFO()
|
||||||
|
|
||||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8js_registerextension, 0, 0, 2)
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8js_registerextension, 0, 0, 2)
|
||||||
ZEND_ARG_INFO(0, extension_name)
|
ZEND_ARG_INFO(0, extension_name)
|
||||||
ZEND_ARG_INFO(0, script)
|
ZEND_ARG_INFO(0, script)
|
||||||
@ -1217,6 +1239,7 @@ const zend_function_entry v8js_methods[] = { /* {{{ */
|
|||||||
PHP_ME(V8Js, setModuleLoader, arginfo_v8js_setmoduleloader, ZEND_ACC_PUBLIC)
|
PHP_ME(V8Js, setModuleLoader, arginfo_v8js_setmoduleloader, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(V8Js, setTimeLimit, arginfo_v8js_settimelimit, ZEND_ACC_PUBLIC)
|
PHP_ME(V8Js, setTimeLimit, arginfo_v8js_settimelimit, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(V8Js, setMemoryLimit, arginfo_v8js_setmemorylimit, ZEND_ACC_PUBLIC)
|
PHP_ME(V8Js, setMemoryLimit, arginfo_v8js_setmemorylimit, ZEND_ACC_PUBLIC)
|
||||||
|
PHP_ME(V8Js, setAverageObjectSize, arginfo_v8js_setaverageobjectsize, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(V8Js, registerExtension, arginfo_v8js_registerextension, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
|
PHP_ME(V8Js, registerExtension, arginfo_v8js_registerextension, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
|
||||||
PHP_ME(V8Js, getExtensions, arginfo_v8js_getextensions, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
|
PHP_ME(V8Js, getExtensions, arginfo_v8js_getextensions, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ struct v8js_ctx {
|
|||||||
bool time_limit_hit;
|
bool time_limit_hit;
|
||||||
long memory_limit;
|
long memory_limit;
|
||||||
bool memory_limit_hit;
|
bool memory_limit_hit;
|
||||||
|
long average_object_size;
|
||||||
|
|
||||||
v8js_tmpl_t global_template;
|
v8js_tmpl_t global_template;
|
||||||
v8js_tmpl_t array_tmpl;
|
v8js_tmpl_t array_tmpl;
|
||||||
|
@ -259,7 +259,7 @@ static void v8js_construct_callback(const v8::FunctionCallbackInfo<v8::Value>& i
|
|||||||
|
|
||||||
// Just tell v8 that we're allocating some external memory
|
// Just tell v8 that we're allocating some external memory
|
||||||
// (for the moment we just always tell 1k instead of trying to find out actual values)
|
// (for the moment we just always tell 1k instead of trying to find out actual values)
|
||||||
isolate->AdjustAmountOfExternalAllocatedMemory(1024);
|
isolate->AdjustAmountOfExternalAllocatedMemory(ctx->average_object_size);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
@ -275,7 +275,7 @@ static void v8js_weak_object_callback(const v8::WeakCallbackData<v8::Object, zva
|
|||||||
ctx->weak_objects.at(value).Reset();
|
ctx->weak_objects.at(value).Reset();
|
||||||
ctx->weak_objects.erase(value);
|
ctx->weak_objects.erase(value);
|
||||||
|
|
||||||
isolate->AdjustAmountOfExternalAllocatedMemory(-1024);
|
isolate->AdjustAmountOfExternalAllocatedMemory(-ctx->average_object_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void v8js_weak_closure_callback(const v8::WeakCallbackData<v8::Object, v8js_tmpl_t> &data) {
|
static void v8js_weak_closure_callback(const v8::WeakCallbackData<v8::Object, v8js_tmpl_t> &data) {
|
||||||
|
Loading…
Reference in New Issue
Block a user