| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent e8cc269 commit 7d1d00f
11 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -753,7 +753,7 @@ void AsyncWrap::EmitDestroy(Environment* env, double async_id) { | |||
| 753 | 753 | } | |
| 754 | 754 | ||
| 755 | 755 | if (env->destroy_async_id_list()->empty()) { | |
| 756 | - env->SetUnrefImmediate(&DestroyAsyncIdsCallback); | ||
| 756 | + env->SetImmediate(&DestroyAsyncIdsCallback, CallbackFlags::kUnrefed); | ||
| 757 | 757 | } | |
| 758 | 758 | ||
| 759 | 759 | env->destroy_async_id_list()->push_back(async_id); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -10,8 +10,8 @@ namespace node { | |||
| 10 | 10 | template <typename R, typename... Args> | |
| 11 | 11 | template <typename Fn> | |
| 12 | 12 | std::unique_ptr<typename CallbackQueue<R, Args...>::Callback> | |
| 13 | - CallbackQueue<R, Args...>::CreateCallback(Fn&& fn, bool refed) { | ||
| 14 | - return std::make_unique<CallbackImpl<Fn>>(std::move(fn), refed); | ||
| 13 | + CallbackQueue<R, Args...>::CreateCallback(Fn&& fn, CallbackFlags::Flags flags) { | ||
| 14 | + return std::make_unique<CallbackImpl<Fn>>(std::move(fn), flags); | ||
| 15 | 15 | } | |
| 16 | 16 | ||
| 17 | 17 | template <typename R, typename... Args> | |
@@ -57,12 +57,12 @@ size_t CallbackQueue<R, Args...>::size() const { | |||
| 57 | 57 | } | |
| 58 | 58 | ||
| 59 | 59 | template <typename R, typename... Args> | |
| 60 | - CallbackQueue<R, Args...>::Callback::Callback(bool refed) | ||
| 61 | - : refed_(refed) {} | ||
| 60 | + CallbackQueue<R, Args...>::Callback::Callback(CallbackFlags::Flags flags) | ||
| 61 | + : flags_(flags) {} | ||
| 62 | 62 | ||
| 63 | 63 | template <typename R, typename... Args> | |
| 64 | - bool CallbackQueue<R, Args...>::Callback::is_refed() const { | ||
| 65 | - return refed_; | ||
| 64 | + CallbackFlags::Flags CallbackQueue<R, Args...>::Callback::flags() const { | ||
| 65 | + return flags_; | ||
| 66 | 66 | } | |
| 67 | 67 | ||
| 68 | 68 | template <typename R, typename... Args> | |
@@ -80,8 +80,8 @@ void CallbackQueue<R, Args...>::Callback::set_next( | |||
| 80 | 80 | template <typename R, typename... Args> | |
| 81 | 81 | template <typename Fn> | |
| 82 | 82 | CallbackQueue<R, Args...>::CallbackImpl<Fn>::CallbackImpl( | |
| 83 | - Fn&& callback, bool refed) | ||
| 84 | - : Callback(refed), | ||
| 83 | + Fn&& callback, CallbackFlags::Flags flags) | ||
| 84 | + : Callback(flags), | ||
| 85 | 85 | callback_(std::move(callback)) {} | |
| 86 | 86 | ||
| 87 | 87 | template <typename R, typename... Args> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -7,6 +7,13 @@ | |||
| 7 | 7 | ||
| 8 | 8 | namespace node { | |
| 9 | 9 | ||
| 10 | + namespace CallbackFlags { | ||
| 11 | + enum Flags { | ||
| 12 | + kUnrefed = 0, | ||
| 13 | + kRefed = 1, | ||
| 14 | + }; | ||
| 15 | + } | ||
| 16 | + | ||
| 10 | 17 | // A queue of C++ functions that take Args... as arguments and return R | |
| 11 | 18 | // (this is similar to the signature of std::function). | |
| 12 | 19 | // New entries are added using `CreateCallback()`/`Push()`, and removed using | |
@@ -18,25 +25,26 @@ class CallbackQueue { | |||
| 18 | 25 | public: | |
| 19 | 26 | class Callback { | |
| 20 | 27 | public: | |
| 21 | - explicit inline Callback(bool refed); | ||
| 28 | + explicit inline Callback(CallbackFlags::Flags flags); | ||
| 22 | 29 | ||
| 23 | 30 | virtual ~Callback() = default; | |
| 24 | 31 | virtual R Call(Args... args) = 0; | |
| 25 | 32 | ||
| 26 | - inline bool is_refed() const; | ||
| 33 | + inline CallbackFlags::Flags flags() const; | ||
| 27 | 34 | ||
| 28 | 35 | private: | |
| 29 | 36 | inline std::unique_ptr<Callback> get_next(); | |
| 30 | 37 | inline void set_next(std::unique_ptr<Callback> next); | |
| 31 | 38 | ||
| 32 | - bool refed_; | ||
| 39 | + CallbackFlags::Flags flags_; | ||
| 33 | 40 | std::unique_ptr<Callback> next_; | |
| 34 | 41 | ||
| 35 | 42 | friend class CallbackQueue; | |
| 36 | 43 | }; | |
| 37 | 44 | ||
| 38 | 45 | template <typename Fn> | |
| 39 | - inline std::unique_ptr<Callback> CreateCallback(Fn&& fn, bool refed); | ||
| 46 | + inline std::unique_ptr<Callback> CreateCallback( | ||
| 47 | + Fn&& fn, CallbackFlags::Flags); | ||
| 40 | 48 | ||
| 41 | 49 | inline std::unique_ptr<Callback> Shift(); | |
| 42 | 50 | inline void Push(std::unique_ptr<Callback> cb); | |
@@ -51,7 +59,7 @@ class CallbackQueue { | |||
| 51 | 59 | template <typename Fn> | |
| 52 | 60 | class CallbackImpl final : public Callback { | |
| 53 | 61 | public: | |
| 54 | - CallbackImpl(Fn&& callback, bool refed); | ||
| 62 | + CallbackImpl(Fn&& callback, CallbackFlags::Flags flags); | ||
| 55 | 63 | R Call(Args... args) override; | |
| 56 | 64 | ||
| 57 | 65 | private: | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -707,29 +707,21 @@ inline void IsolateData::set_options( | |||
| 707 | 707 | } | |
| 708 | 708 | ||
| 709 | 709 | template <typename Fn> | |
| 710 | - void Environment::CreateImmediate(Fn&& cb, bool ref) { | ||
| 711 | - auto callback = native_immediates_.CreateCallback(std::move(cb), ref); | ||
| 710 | + void Environment::SetImmediate(Fn&& cb, CallbackFlags::Flags flags) { | ||
| 711 | + auto callback = native_immediates_.CreateCallback(std::move(cb), flags); | ||
| 712 | 712 | native_immediates_.Push(std::move(callback)); | |
| 713 | - } | ||
| 714 | - | ||
| 715 | - template <typename Fn> | ||
| 716 | - void Environment::SetImmediate(Fn&& cb) { | ||
| 717 | - CreateImmediate(std::move(cb), true); | ||
| 718 | 713 | ||
| 719 | - if (immediate_info()->ref_count() == 0) | ||
| 720 | - ToggleImmediateRef(true); | ||
| 721 | - immediate_info()->ref_count_inc(1); | ||
| 722 | - } | ||
| 723 | - | ||
| 724 | - template <typename Fn> | ||
| 725 | - void Environment::SetUnrefImmediate(Fn&& cb) { | ||
| 726 | - CreateImmediate(std::move(cb), false); | ||
| 714 | + if (flags & CallbackFlags::kRefed) { | ||
| 715 | + if (immediate_info()->ref_count() == 0) | ||
| 716 | + ToggleImmediateRef(true); | ||
| 717 | + immediate_info()->ref_count_inc(1); | ||
| 718 | + } | ||
| 727 | 719 | } | |
| 728 | 720 | ||
| 729 | 721 | template <typename Fn> | |
| 730 | - void Environment::SetImmediateThreadsafe(Fn&& cb, bool refed) { | ||
| 731 | - auto callback = | ||
| 732 | - native_immediates_threadsafe_.CreateCallback(std::move(cb), refed); | ||
| 722 | + void Environment::SetImmediateThreadsafe(Fn&& cb, CallbackFlags::Flags flags) { | ||
| 723 | + auto callback = native_immediates_threadsafe_.CreateCallback( | ||
| 724 | + std::move(cb), flags); | ||
| 733 | 725 | { | |
| 734 | 726 | Mutex::ScopedLock lock(native_immediates_threadsafe_mutex_); | |
| 735 | 727 | native_immediates_threadsafe_.Push(std::move(callback)); | |
@@ -740,8 +732,8 @@ void Environment::SetImmediateThreadsafe(Fn&& cb, bool refed) { | |||
| 740 | 732 | ||
| 741 | 733 | template <typename Fn> | |
| 742 | 734 | void Environment::RequestInterrupt(Fn&& cb) { | |
| 743 | - auto callback = | ||
| 744 | - native_immediates_interrupts_.CreateCallback(std::move(cb), false); | ||
| 735 | + auto callback = native_immediates_interrupts_.CreateCallback( | ||
| 736 | + std::move(cb), CallbackFlags::kRefed); | ||
| 745 | 737 | { | |
| 746 | 738 | Mutex::ScopedLock lock(native_immediates_threadsafe_mutex_); | |
| 747 | 739 | native_immediates_interrupts_.Push(std::move(callback)); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -587,7 +587,7 @@ void Environment::CleanupHandles() { | |||
| 587 | 587 | Isolate::DisallowJavascriptExecutionScope disallow_js(isolate(), | |
| 588 | 588 | Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); | |
| 589 | 589 | ||
| 590 | - RunAndClearNativeImmediates(true /* skip SetUnrefImmediate()s */); | ||
| 590 | + RunAndClearNativeImmediates(true /* skip unrefed SetImmediate()s */); | ||
| 591 | 591 | ||
| 592 | 592 | for (ReqWrapBase* request : req_wrap_queue_) | |
| 593 | 593 | request->Cancel(); | |
@@ -730,10 +730,11 @@ void Environment::RunAndClearNativeImmediates(bool only_refed) { | |||
| 730 | 730 | TryCatchScope try_catch(this); | |
| 731 | 731 | DebugSealHandleScope seal_handle_scope(isolate()); | |
| 732 | 732 | while (auto head = queue->Shift()) { | |
| 733 | - if (head->is_refed()) | ||
| 733 | + bool is_refed = head->flags() & CallbackFlags::kRefed; | ||
| 734 | + if (is_refed) | ||
| 734 | 735 | ref_count++; | |
| 735 | 736 | ||
| 736 | - if (head->is_refed() || !only_refed) | ||
| 737 | + if (is_refed || !only_refed) | ||
| 737 | 738 | head->Call(this); | |
| 738 | 739 | ||
| 739 | 740 | head.reset(); // Destroy now so that this is also observed by try_catch. | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1163,12 +1163,12 @@ class Environment : public MemoryRetainer { | |||
| 1163 | 1163 | // Unlike the JS setImmediate() function, nested SetImmediate() calls will | |
| 1164 | 1164 | // be run without returning control to the event loop, similar to nextTick(). | |
| 1165 | 1165 | template <typename Fn> | |
| 1166 | - inline void SetImmediate(Fn&& cb); | ||
| 1167 | - template <typename Fn> | ||
| 1168 | - inline void SetUnrefImmediate(Fn&& cb); | ||
| 1166 | + inline void SetImmediate( | ||
| 1167 | + Fn&& cb, CallbackFlags::Flags flags = CallbackFlags::kRefed); | ||
| 1169 | 1168 | template <typename Fn> | |
| 1170 | 1169 | // This behaves like SetImmediate() but can be called from any thread. | |
| 1171 | - inline void SetImmediateThreadsafe(Fn&& cb, bool refed = true); | ||
| 1170 | + inline void SetImmediateThreadsafe( | ||
| 1171 | + Fn&& cb, CallbackFlags::Flags flags = CallbackFlags::kRefed); | ||
| 1172 | 1172 | // This behaves like V8's Isolate::RequestInterrupt(), but also accounts for | |
| 1173 | 1173 | // the event loop (i.e. combines the V8 function with SetImmediate()). | |
| 1174 | 1174 | // The passed callback may not throw exceptions. | |
@@ -1251,9 +1251,6 @@ class Environment : public MemoryRetainer { | |||
| 1251 | 1251 | void RunAndClearInterrupts(); | |
| 1252 | 1252 | ||
| 1253 | 1253 | private: | |
| 1254 | - template <typename Fn> | ||
| 1255 | - inline void CreateImmediate(Fn&& cb, bool ref); | ||
| 1256 | - | ||
| 1257 | 1254 | inline void ThrowError(v8::Local<v8::Value> (*fun)(v8::Local<v8::String>), | |
| 1258 | 1255 | const char* errmsg); | |
| 1259 | 1256 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -126,10 +126,10 @@ inline void DirHandle::GCClose() { | |||
| 126 | 126 | // to notify that the file descriptor was gc'd. We want to be noisy about | |
| 127 | 127 | // this because not explicitly closing the DirHandle is a bug. | |
| 128 | 128 | ||
| 129 | - env()->SetUnrefImmediate([](Environment* env) { | ||
| 129 | + env()->SetImmediate([](Environment* env) { | ||
| 130 | 130 | ProcessEmitWarning(env, | |
| 131 | 131 | "Closing directory handle on garbage collection"); | |
| 132 | - }); | ||
| 132 | + }, CallbackFlags::kUnrefed); | ||
| 133 | 133 | } | |
| 134 | 134 | ||
| 135 | 135 | void AfterClose(uv_fs_t* req) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -226,7 +226,7 @@ inline void FileHandle::Close() { | |||
| 226 | 226 | // to notify that the file descriptor was gc'd. We want to be noisy about | |
| 227 | 227 | // this because not explicitly closing the FileHandle is a bug. | |
| 228 | 228 | ||
| 229 | - env()->SetUnrefImmediate([detail](Environment* env) { | ||
| 229 | + env()->SetImmediate([detail](Environment* env) { | ||
| 230 | 230 | ProcessEmitWarning(env, | |
| 231 | 231 | "Closing file descriptor %d on garbage collection", | |
| 232 | 232 | detail.fd); | |
@@ -240,7 +240,7 @@ inline void FileHandle::Close() { | |||
| 240 | 240 | "thrown if a file descriptor is closed during garbage collection.", | |
| 241 | 241 | "DEP0137").IsNothing(); | |
| 242 | 242 | } | |
| 243 | - }); | ||
| 243 | + }, CallbackFlags::kUnrefed); | ||
| 244 | 244 | } | |
| 245 | 245 | ||
| 246 | 246 | void FileHandle::CloseReq::Resolve() { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -282,9 +282,9 @@ void MarkGarbageCollectionEnd(Isolate* isolate, | |||
| 282 | 282 | static_cast<PerformanceGCFlags>(flags), | |
| 283 | 283 | state->performance_last_gc_start_mark, | |
| 284 | 284 | PERFORMANCE_NOW()); | |
| 285 | - env->SetUnrefImmediate([entry = std::move(entry)](Environment* env) mutable { | ||
| 285 | + env->SetImmediate([entry = std::move(entry)](Environment* env) mutable { | ||
| 286 | 286 | PerformanceGCCallback(env, std::move(entry)); | |
| 287 | - }); | ||
| 287 | + }, CallbackFlags::kUnrefed); | ||
| 288 | 288 | } | |
| 289 | 289 | ||
| 290 | 290 | void GarbageCollectionCleanupHook(void* data) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -759,7 +759,7 @@ void Worker::TakeHeapSnapshot(const FunctionCallbackInfo<Value>& args) { | |||
| 759 | 759 | env, std::move(snapshot)); | |
| 760 | 760 | Local<Value> args[] = { stream->object() }; | |
| 761 | 761 | taker->MakeCallback(env->ondone_string(), arraysize(args), args); | |
| 762 | - }, /* refed */ false); | ||
| 762 | + }, CallbackFlags::kUnrefed); | ||
| 763 | 763 | }); | |
| 764 | 764 | args.GetReturnValue().Set(scheduled ? taker->object() : Local<Object>()); | |
| 765 | 765 | } | |
| Back | FazBrowse Home | New Git URL |
0 commit comments