forked from nodejs/node
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
src: limit foreground tasks draining loop
Foreground tasks that repost themselves can force the draining loop to run indefinitely long without giving other tasks chance to run. This limits the foreground task draining loop to run only the tasks that were in the tasks queue at the beginning of the loop. PR-URL: nodejs#19987 Fixes: nodejs#19937 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Yang Guo <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Tiancheng "Timothy" Gu <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Anatoli Papirovski <[email protected]> Reviewed-By: Khaidi Chu <[email protected]>
- Loading branch information
1 parent
95197ed
commit d3edf2f
Showing
5 changed files
with
83 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#include "node_internals.h" | ||
#include "libplatform/libplatform.h" | ||
|
||
#include <string> | ||
#include "gtest/gtest.h" | ||
#include "node_test_fixture.h" | ||
|
||
// This task increments the given run counter and reposts itself until the | ||
// repost counter reaches zero. | ||
class RepostingTask : public v8::Task { | ||
public: | ||
explicit RepostingTask(int repost_count, | ||
int* run_count, | ||
v8::Isolate* isolate, | ||
node::NodePlatform* platform) | ||
: repost_count_(repost_count), | ||
run_count_(run_count), | ||
isolate_(isolate), | ||
platform_(platform) {} | ||
|
||
// v8::Task implementation | ||
void Run() final { | ||
++*run_count_; | ||
if (repost_count_ > 0) { | ||
--repost_count_; | ||
platform_->CallOnForegroundThread(isolate_, | ||
new RepostingTask(repost_count_, run_count_, isolate_, platform_)); | ||
} | ||
} | ||
|
||
private: | ||
int repost_count_; | ||
int* run_count_; | ||
v8::Isolate* isolate_; | ||
node::NodePlatform* platform_; | ||
}; | ||
|
||
class PlatformTest : public EnvironmentTestFixture {}; | ||
|
||
TEST_F(PlatformTest, SkipNewTasksInFlushForegroundTasks) { | ||
v8::Isolate::Scope isolate_scope(isolate_); | ||
const v8::HandleScope handle_scope(isolate_); | ||
const Argv argv; | ||
Env env {handle_scope, argv}; | ||
int run_count = 0; | ||
platform->CallOnForegroundThread( | ||
isolate_, new RepostingTask(2, &run_count, isolate_, platform.get())); | ||
EXPECT_TRUE(platform->FlushForegroundTasks(isolate_)); | ||
EXPECT_EQ(1, run_count); | ||
EXPECT_TRUE(platform->FlushForegroundTasks(isolate_)); | ||
EXPECT_EQ(2, run_count); | ||
EXPECT_TRUE(platform->FlushForegroundTasks(isolate_)); | ||
EXPECT_EQ(3, run_count); | ||
EXPECT_FALSE(platform->FlushForegroundTasks(isolate_)); | ||
} |