Skip to content

Microtask queue is not flushed when promises are fulfilled in C++ #5691

@vkurchatkin

Description

@vkurchatkin

Reproduction:

#include <node.h>
#include <uv.h>
#include <unistd.h>

static v8::Persistent<v8::Promise::Resolver> persistent;

void run(uv_work_t* req) {
  sleep(1);
}

void callback(uv_work_t* req, int i) {
  v8::Isolate* isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);

  v8::Local<v8::Promise::Resolver> local = v8::Local<v8::Promise::Resolver>::New(isolate, persistent);
  local->Resolve(v8::Undefined(isolate));
}

void test(const v8::FunctionCallbackInfo<v8::Value>& args) {
  v8::Isolate* isolate = args.GetIsolate();

  if (persistent.IsEmpty()) {
    persistent.Reset(isolate, v8::Promise::Resolver::New(isolate));

    uv_work_t * req = (uv_work_t*) malloc(sizeof(uv_work_t));

    uv_queue_work(uv_default_loop(), req, run, callback);
  }

  v8::Local<v8::Promise::Resolver> local = v8::Local<v8::Promise::Resolver>::New(isolate, persistent);

  args.GetReturnValue().Set(local->GetPromise());
}

void init(v8::Local<v8::Object> exports) {
  NODE_SET_METHOD(exports, "test", test);
}

NODE_MODULE(addon, init)
var r = require('./build/Release/addon.node');

r.test().then(function() {
  console.log('done');
});


setTimeout(() => {}, 5000);

done should be printed after 1 seconds, but is printed after 5 seconds instead.

Metadata

Metadata

Assignees

No one assigned

    Labels

    addonsIssues and PRs related to native addons.c++Issues and PRs that require attention from people who are familiar with C++.confirmed-bugIssues with confirmed bugs.promisesIssues and PRs related to ECMAScript promises.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions