Skip to content
This repository was archived by the owner on Mar 29, 2024. It is now read-only.

Commit 7750040

Browse files
committed
Adjust external allocated memory using object-specific size value
1 parent e17dabc commit 7750040

7 files changed

+98
-16
lines changed

src/php_v8_callbacks.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,24 @@ namespace phpv8 {
155155

156156
return bucket.get();
157157
}
158+
159+
int64_t PersistentData::calculateSize() {
160+
int64_t size = sizeof(*this);
161+
162+
for (auto const &item : buckets) {
163+
size += sizeof(std::shared_ptr<CallbacksBucket>);
164+
size += item.first.capacity();
165+
size += item.second->calculateSize();
166+
}
167+
168+
return size;
169+
}
170+
171+
int64_t PersistentData::adjustSize(int64_t change_in_bytes) {
172+
adjusted_size_ += change_in_bytes;
173+
assert(adjusted_size_ >= 0);
174+
return adjusted_size_;
175+
}
158176
}
159177

160178
void php_v8_callbacks_gc(phpv8::PersistentData *data, zval **gc_data, int * gc_data_count, zval **table, int *n) {

src/php_v8_callbacks.h

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ namespace phpv8 {
2222
template <class T> class PersistentCollection;
2323
}
2424

25+
2526
#include <v8.h>
2627
#include <map>
2728
#include <string>
29+
#include <utility>
2830

2931
extern "C" {
3032
#include "php.h"
@@ -57,6 +59,13 @@ extern void php_v8_callback_indexed_property_enumerator(const v8::PropertyCallba
5759

5860
extern bool php_v8_callback_access_check(v8::Local<v8::Context> accessing_context, v8::Local<v8::Object> accessed_object, v8::Local<v8::Value> data);
5961

62+
//#define PHP_V8_DEBUG_EXTERNAL_MEM 1
63+
64+
#ifdef PHP_V8_DEBUG_EXTERNAL_MEM
65+
#define php_v8_debug_external_mem(format, ...) fprintf(stderr, (format), ##__VA_ARGS__);
66+
#else
67+
#define php_v8_debug_external_mem(format, ...)
68+
#endif
6069

6170
namespace phpv8 {
6271

@@ -95,8 +104,13 @@ namespace phpv8 {
95104
inline bool empty() {
96105
return callbacks.empty();
97106
}
107+
108+
inline int64_t calculateSize() {
109+
return sizeof(*this) + (sizeof(std::shared_ptr<Callback>) + sizeof(Callback)) * callbacks.size();
110+
}
111+
98112
private:
99-
std::map<size_t, std::shared_ptr<phpv8::Callback>> callbacks;
113+
std::map<size_t, std::shared_ptr<Callback>> callbacks;
100114
};
101115

102116

@@ -114,7 +128,20 @@ namespace phpv8 {
114128
return buckets.empty();
115129
}
116130

131+
int64_t calculateSize();
132+
133+
inline int64_t getTotalSize() {
134+
if (!size_) {
135+
size_ = calculateSize();
136+
}
137+
138+
return size_ + adjusted_size_;
139+
}
140+
141+
int64_t adjustSize(int64_t change_in_bytes);
117142
private:
143+
int64_t size_;
144+
int64_t adjusted_size_;
118145
std::map<std::string, std::shared_ptr<CallbacksBucket>> buckets;
119146
};
120147

@@ -149,9 +176,20 @@ namespace phpv8 {
149176
collection[persistent] = std::shared_ptr<phpv8::PersistentData>(data);
150177
}
151178

179+
phpv8::PersistentData *get(v8::Persistent<T> *persistent) {
180+
auto it = collection.find(persistent);
181+
182+
if (it != collection.end()) {
183+
return it->second.get();
184+
}
185+
186+
return nullptr;
187+
}
188+
152189
void remove(v8::Persistent<T, v8::NonCopyablePersistentTraits<T>> *persistent) {
153190
collection.erase(persistent);
154-
} private:
191+
}
192+
private:
155193
std::map<v8::Persistent<T> *, std::shared_ptr<phpv8::PersistentData>> collection;
156194
};
157195
}

src/php_v8_function_template.cc

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,17 @@ static void php_v8_function_template_weak_callback(const v8::WeakCallbackInfo<v8
4242
v8::Isolate *isolate = data.GetIsolate();
4343
php_v8_isolate_t *php_v8_isolate = PHP_V8_ISOLATE_FETCH_REFERENCE(isolate);
4444

45-
php_v8_isolate->weak_function_templates->remove(data.GetParameter());
45+
phpv8::PersistentData *persistent_data = php_v8_isolate->weak_function_templates->get(data.GetParameter());
46+
47+
if (persistent_data != nullptr) {
48+
// Tell v8 that we release external allocated memory
49+
php_v8_debug_external_mem("Free allocated external memory (func tpl: %p): -%" PRId64 "\n", persistent_data, persistent_data->getTotalSize())
50+
isolate->AdjustAmountOfExternalAllocatedMemory(-persistent_data->getTotalSize());
51+
php_v8_isolate->weak_function_templates->remove(data.GetParameter());
52+
}
4653

4754
data.GetParameter()->Reset();
4855
delete data.GetParameter();
49-
50-
// Tell v8 that we release external allocated memory
51-
isolate->AdjustAmountOfExternalAllocatedMemory(-1024 * 1024 * 1024);
5256
}
5357

5458
void php_v8_function_template_make_weak(php_v8_function_template_t *php_v8_function_template) {
@@ -57,7 +61,9 @@ void php_v8_function_template_make_weak(php_v8_function_template_t *php_v8_funct
5761
php_v8_function_template->is_weak = true;
5862
php_v8_function_template->persistent->SetWeak(php_v8_function_template->persistent, php_v8_function_template_weak_callback, v8::WeakCallbackType::kParameter);
5963

60-
php_v8_function_template->php_v8_isolate->isolate->AdjustAmountOfExternalAllocatedMemory(1024 * 1024 * 1024);
64+
// Tell v8 that we allocated external memory
65+
php_v8_debug_external_mem("Allocate external memory (func tpl: %p): %" PRId64 "\n", php_v8_function_template->persistent_data, php_v8_function_template->persistent_data->getTotalSize())
66+
php_v8_function_template->php_v8_isolate->isolate->AdjustAmountOfExternalAllocatedMemory(php_v8_function_template->persistent_data->getTotalSize());
6167
}
6268

6369

src/php_v8_isolate_limits.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
#define PHP_V8_TIME_SLEEP_MILLISECONDS 10
2323

2424
//#define PHP_V8_DEBUG_EXECUTION 1
25-
26-
#define mb(sz) ((sz)/1024/1024.0)
25+
#define one_mb (1024.0 * 1024.0)
26+
#define kb(sz) ((sz)/1024.0)
27+
#define mb(sz) (kb(sz)/1024.0)
2728
#define has(v, str) (v ? "has " str : "no " str)
2829
#define is(v) (v ? "yes" : "no")
2930

src/php_v8_object_template.cc

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,17 @@ static void php_v8_object_template_weak_callback(const v8::WeakCallbackInfo<v8::
4545
v8::Isolate *isolate = data.GetIsolate();
4646
php_v8_isolate_t *php_v8_isolate = PHP_V8_ISOLATE_FETCH_REFERENCE(isolate);
4747

48-
php_v8_isolate->weak_object_templates->remove(data.GetParameter());
48+
phpv8::PersistentData *persistent_data = php_v8_isolate->weak_object_templates->get(data.GetParameter());
49+
50+
if (persistent_data != nullptr) {
51+
// Tell v8 that we release external allocated memory
52+
php_v8_debug_external_mem("Free allocated external memory (obj tpl: %p): -%" PRId64 "\n", persistent_data, persistent_data->getTotalSize())
53+
isolate->AdjustAmountOfExternalAllocatedMemory(-persistent_data->getTotalSize());
54+
php_v8_isolate->weak_object_templates->remove(data.GetParameter());
55+
}
4956

5057
data.GetParameter()->Reset();
5158
delete data.GetParameter();
52-
53-
// Tell v8 that we release external allocated memory
54-
isolate->AdjustAmountOfExternalAllocatedMemory(-1024 * 1024 * 1024);
5559
}
5660

5761

@@ -61,7 +65,9 @@ static void php_v8_object_template_make_weak(php_v8_object_template_t *php_v8_ob
6165
php_v8_object_template->is_weak = true;
6266
php_v8_object_template->persistent->SetWeak(php_v8_object_template->persistent, php_v8_object_template_weak_callback, v8::WeakCallbackType::kParameter);
6367

64-
php_v8_object_template->php_v8_isolate->isolate->AdjustAmountOfExternalAllocatedMemory(1024 * 1024 * 1024);
68+
// Tell v8 that we allocated external memory
69+
php_v8_debug_external_mem("Allocate external memory (obj tpl: %p): %" PRId64 "\n", php_v8_object_template->persistent_data, php_v8_object_template->persistent_data->getTotalSize())
70+
php_v8_object_template->php_v8_isolate->isolate->AdjustAmountOfExternalAllocatedMemory(php_v8_object_template->persistent_data->getTotalSize());
6571
}
6672

6773
static HashTable * php_v8_object_template_gc(zval *object, zval **table, int *n) {

src/php_v8_value.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,14 @@ static void php_v8_value_weak_callback(const v8::WeakCallbackInfo<v8::Persistent
6262
v8::Isolate *isolate = data.GetIsolate();
6363
php_v8_isolate_t *php_v8_isolate = PHP_V8_ISOLATE_FETCH_REFERENCE(isolate);
6464

65-
php_v8_isolate->weak_values->remove(data.GetParameter());
65+
phpv8::PersistentData *persistent_data = php_v8_isolate->weak_values->get(data.GetParameter());
66+
67+
if (persistent_data != nullptr) {
68+
// Tell v8 that we release external allocated memory
69+
php_v8_debug_external_mem("Free allocated external memory (value: %p): -%" PRId64 "\n", persistent_data, persistent_data->getTotalSize())
70+
isolate->AdjustAmountOfExternalAllocatedMemory(-persistent_data->getTotalSize());
71+
php_v8_isolate->weak_values->remove(data.GetParameter());
72+
}
6673

6774
data.GetParameter()->Reset();
6875
delete data.GetParameter();
@@ -80,7 +87,9 @@ static void php_v8_value_make_weak(php_v8_value_t *php_v8_value) {
8087
php_v8_value->is_weak = true;
8188
php_v8_value->persistent->SetWeak(php_v8_value->persistent, php_v8_value_weak_callback, v8::WeakCallbackType::kParameter);
8289

83-
php_v8_value->php_v8_isolate->isolate->AdjustAmountOfExternalAllocatedMemory(1024 * 1024 * 1024);
90+
// Tell v8 that we allocated external memory
91+
php_v8_debug_external_mem("Allocate external memory (value: %p): %" PRId64 "\n", php_v8_value->persistent_data, php_v8_value->persistent_data->getTotalSize())
92+
php_v8_value->php_v8_isolate->isolate->AdjustAmountOfExternalAllocatedMemory(php_v8_value->persistent_data->getTotalSize());
8493
}
8594

8695
static HashTable * php_v8_value_gc(zval *object, zval **table, int *n) {

tests/V8Exception_CreateMessage.phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ $helper->line();
7171

7272
$v8_helper->run_checks($res);
7373
?>
74+
EOF
7475
--EXPECTF--
7576
Can create message when out of context: ok
7677

@@ -180,3 +181,6 @@ V8\ObjectValue(V8\Value)->IsStringObject(): bool(false)
180181
V8\ObjectValue(V8\Value)->IsSymbolObject(): bool(false)
181182
V8\ObjectValue(V8\Value)->IsNativeError(): bool(false)
182183
V8\ObjectValue(V8\Value)->IsRegExp(): bool(false)
184+
185+
186+
EOF

0 commit comments

Comments
 (0)