@@ -84,7 +84,7 @@ using v8::Value; |
84 | 84 |
|
85 | 85 | namespace { |
86 | 86 |
|
87 | | -class CallbackInfo { |
| 87 | +class CallbackInfo : public Cleanable { |
88 | 88 | public: |
89 | 89 | static inline Local<ArrayBuffer> CreateTrackedArrayBuffer( |
90 | 90 | Environment* env, |
@@ -97,7 +97,7 @@ class CallbackInfo { |
97 | 97 | CallbackInfo& operator=(const CallbackInfo&) = delete; |
98 | 98 |
|
99 | 99 | private: |
100 | | - static void CleanupHook(void* data); |
| 100 | + void Clean(); |
101 | 101 | inline void OnBackingStoreFree(); |
102 | 102 | inline void CallAndResetCallback(); |
103 | 103 | inline CallbackInfo(Environment* env, |
@@ -112,7 +112,6 @@ class CallbackInfo { |
112 | 112 | Environment* const env_; |
113 | 113 | }; |
114 | 114 |
|
115 | | - |
116 | 115 | Local<ArrayBuffer> CallbackInfo::CreateTrackedArrayBuffer( |
117 | 116 | Environment* env, |
118 | 117 | char* data, |
@@ -152,25 +151,23 @@ CallbackInfo::CallbackInfo(Environment* env, |
152 | 151 | data_(data), |
153 | 152 | hint_(hint), |
154 | 153 | env_(env) { |
155 | | - env->AddCleanupHook(CleanupHook, this); |
| 154 | + env->cleanable_queue()->PushFront(this); |
156 | 155 | env->isolate()->AdjustAmountOfExternalAllocatedMemory(sizeof(*this)); |
157 | 156 | } |
158 | 157 |
|
159 | | -void CallbackInfo::CleanupHook(void* data) { |
160 | | - CallbackInfo* self = static_cast<CallbackInfo*>(data); |
161 | | - |
| 158 | +void CallbackInfo::Clean() { |
162 | 159 | { |
163 | | - HandleScope handle_scope(self->env_->isolate()); |
164 | | - Local<ArrayBuffer> ab = self->persistent_.Get(self->env_->isolate()); |
| 160 | + HandleScope handle_scope(env_->isolate()); |
| 161 | + Local<ArrayBuffer> ab = persistent_.Get(env_->isolate()); |
165 | 162 | if (!ab.IsEmpty() && ab->IsDetachable()) { |
166 | 163 | ab->Detach(Local<Value>()).Check(); |
167 | | - self->persistent_.Reset(); |
| 164 | + persistent_.Reset(); |
168 | 165 | } |
169 | 166 | } |
170 | 167 |
|
171 | 168 | // Call the callback in this case, but don't delete `this` yet because the |
172 | 169 | // BackingStore deleter callback will do so later. |
173 | | - self->CallAndResetCallback(); |
| 170 | + CallAndResetCallback(); |
174 | 171 | } |
175 | 172 |
|
176 | 173 | void CallbackInfo::CallAndResetCallback() { |
@@ -182,7 +179,7 @@ void CallbackInfo::CallAndResetCallback() { |
182 | 179 | } |
183 | 180 | if (callback != nullptr) { |
184 | 181 | // Clean up all Environment-related state and run the callback. |
185 | | - env_->RemoveCleanupHook(CleanupHook, this); |
| 182 | + cleanable_queue_.Remove(); |
186 | 183 | int64_t change_in_bytes = -static_cast<int64_t>(sizeof(*this)); |
187 | 184 | env_->isolate()->AdjustAmountOfExternalAllocatedMemory(change_in_bytes); |
188 | 185 |
|
|