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