| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent af63df8 commit 1b76cfe
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -134,26 +134,23 @@ void PerIsolatePlatformData::RunForegroundTask(std::unique_ptr<Task> task) { | |||
| 134 | 134 | task->Run(); | |
| 135 | 135 | } | |
| 136 | 136 | ||
| 137 | + void PerIsolatePlatformData::DeleteFromScheduledTasks(DelayedTask* task) { | ||
| 138 | + auto it = std::find_if(scheduled_delayed_tasks_.begin(), | ||
| 139 | + scheduled_delayed_tasks_.end(), | ||
| 140 | + [task](const DelayedTaskPointer& delayed) -> bool { | ||
| 141 | + return delayed.get() == task; | ||
| 142 | + }); | ||
| 143 | + CHECK_NE(it, scheduled_delayed_tasks_.end()); | ||
| 144 | + scheduled_delayed_tasks_.erase(it); | ||
| 145 | + } | ||
| 146 | + | ||
| 137 | 147 | void PerIsolatePlatformData::RunForegroundTask(uv_timer_t* handle) { | |
| 138 | 148 | DelayedTask* delayed = static_cast<DelayedTask*>(handle->data); | |
| 139 | - auto& tasklist = delayed->platform_data->scheduled_delayed_tasks_; | ||
| 140 | - auto it = std::find(tasklist.begin(), tasklist.end(), delayed); | ||
| 141 | - CHECK_NE(it, tasklist.end()); | ||
| 142 | - tasklist.erase(it); | ||
| 143 | 149 | RunForegroundTask(std::move(delayed->task)); | |
| 144 | - uv_close(reinterpret_cast<uv_handle_t*>(&delayed->timer), | ||
| 145 | - [](uv_handle_t* handle) { | ||
| 146 | - delete static_cast<DelayedTask*>(handle->data); | ||
| 147 | - }); | ||
| 150 | + delayed->platform_data->DeleteFromScheduledTasks(delayed); | ||
| 148 | 151 | } | |
| 149 | 152 | ||
| 150 | 153 | void PerIsolatePlatformData::CancelPendingDelayedTasks() { | |
| 151 | - for (auto delayed : scheduled_delayed_tasks_) { | ||
| 152 | - uv_close(reinterpret_cast<uv_handle_t*>(&delayed->timer), | ||
| 153 | - [](uv_handle_t* handle) { | ||
| 154 | - delete static_cast<DelayedTask*>(handle->data); | ||
| 155 | - }); | ||
| 156 | - } | ||
| 157 | 154 | scheduled_delayed_tasks_.clear(); | |
| 158 | 155 | } | |
| 159 | 156 | ||
@@ -183,7 +180,14 @@ bool PerIsolatePlatformData::FlushForegroundTasksInternal() { | |||
| 183 | 180 | // the delay is non-zero. This should not be a problem in practice. | |
| 184 | 181 | uv_timer_start(&delayed->timer, RunForegroundTask, delay_millis, 0); | |
| 185 | 182 | uv_unref(reinterpret_cast<uv_handle_t*>(&delayed->timer)); | |
| 186 | - scheduled_delayed_tasks_.push_back(delayed.release()); | ||
| 183 | + | ||
| 184 | + scheduled_delayed_tasks_.emplace_back(delayed.release(), | ||
| 185 | + [](DelayedTask* delayed) { | ||
| 186 | + uv_close(reinterpret_cast<uv_handle_t*>(&delayed->timer), | ||
| 187 | + [](uv_handle_t* handle) { | ||
| 188 | + delete static_cast<DelayedTask*>(handle->data); | ||
| 189 | + }); | ||
| 190 | + }); | ||
| 187 | 191 | } | |
| 188 | 192 | while (std::unique_ptr<Task> task = foreground_tasks_.Pop()) { | |
| 189 | 193 | did_work = true; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -64,6 +64,8 @@ class PerIsolatePlatformData { | |||
| 64 | 64 | void CancelPendingDelayedTasks(); | |
| 65 | 65 | ||
| 66 | 66 | private: | |
| 67 | + void DeleteFromScheduledTasks(DelayedTask* task); | ||
| 68 | + | ||
| 67 | 69 | static void FlushTasks(uv_async_t* handle); | |
| 68 | 70 | static void RunForegroundTask(std::unique_ptr<v8::Task> task); | |
| 69 | 71 | static void RunForegroundTask(uv_timer_t* timer); | |
@@ -74,7 +76,11 @@ class PerIsolatePlatformData { | |||
| 74 | 76 | uv_async_t* flush_tasks_ = nullptr; | |
| 75 | 77 | TaskQueue<v8::Task> foreground_tasks_; | |
| 76 | 78 | TaskQueue<DelayedTask> foreground_delayed_tasks_; | |
| 77 | - std::vector<DelayedTask*> scheduled_delayed_tasks_; | ||
| 79 | + | ||
| 80 | + // Use a custom deleter because libuv needs to close the handle first. | ||
| 81 | + typedef std::unique_ptr<DelayedTask, std::function<void(DelayedTask*)>> | ||
| 82 | + DelayedTaskPointer; | ||
| 83 | + std::vector<DelayedTaskPointer> scheduled_delayed_tasks_; | ||
| 78 | 84 | }; | |
| 79 | 85 | ||
| 80 | 86 | class NodePlatform : public MultiIsolatePlatform { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments