nodejs / node

Node.js JavaScript runtime ✨🐢🚀✨
https://nodejs.org
Other
106.61k stars 29.07k forks source link

Project crashed after Worker.terminate() #41107

Open KunalBurangi opened 2 years ago

KunalBurangi commented 2 years ago

Version

14.6

Platform

Windows 10

Subsystem

No response

What steps will reproduce the bug?

Not sure

How often does it reproduce? Is there a required condition?

I am working with the worker threads and it is working fine . i am able to execute stuff in worker thread but the problem is the worker thread is not getting exit on its own . so i am using process.exit(0) or worker.terminate() and it get exits also. but after that if i hit the api again then my project crashes with Process exited with code 3221225477

what is the issue

What is the expected behavior?

No response

What do you see instead?

No response

Additional information

No response

e3dio commented 2 years ago

I also see this (node 17, win11), looks related to native addons (C++), only occurs on Windows no issue on Linux, specifically when the last remaining Worker Thread that has loaded the native addon exits it will crash the process with error code 3221225477. I don't know if it's because the addon did not clean up resources correctly or if is some issue with Node https://nodejs.org/api/addons.html#worker-support. The crash happens after process.on('exit') event fires on the worker, but before worker.on('exit') event fires on main thread, and only occurs after the last remaining worker (can be 1 or more workers) that has loaded the addon exits.

e3dio commented 2 years ago

The example code below works as is, worker thread (from main) exited and main thread exited get logged, but if you uncomment addon require('uWebSockets.js') it will crash the process with code 3221225477 after logging worker thread (inside) exited and the other logs don't get called. Works fine on Linux

const {Worker,isMainThread}=require('worker_threads')
if(isMainThread){
    new Worker(__filename).on('exit',code=>console.log('worker thread (from main) exited',code))
    process.on('exit',()=>console.log('main thread exited'))
}else{
    //require('uWebSockets.js')
    process.on('exit',()=>console.log('worker thread (inside) exited'))
    setTimeout(()=>process.exit(0),1000)
}