Browse Source

fix: `utilityProcess` pid should be `undefined` after exit (#44677)

fix: utilityProcess pid should be undefined after exit
Shelley Vohr 5 months ago
parent
commit
dd50afa8c2

+ 4 - 0
docs/api/utility-process.md

@@ -92,6 +92,8 @@ the child process exits, then the value is `undefined` after the `exit` event is
 ```js
 const child = utilityProcess.fork(path.join(__dirname, 'test.js'))
 
+console.log(child.pid) // undefined
+
 child.on('spawn', () => {
   console.log(child.pid) // Integer
 })
@@ -101,6 +103,8 @@ child.on('exit', () => {
 })
 ```
 
+**Note:** You can use the `pid` to determine if the process is currently running.
+
 #### `child.stdout`
 
 A `NodeJS.ReadableStream | null` that represents the child process's stdout.

+ 2 - 0
shell/browser/api/electron_api_utility_process.cc

@@ -255,6 +255,8 @@ void UtilityProcessWrapper::HandleTermination(uint64_t exit_code) {
 
   if (pid_ != base::kNullProcessId)
     GetAllUtilityProcessWrappers().Remove(pid_);
+
+  pid_ = base::kNullProcessId;
   CloseConnectorPort();
   EmitWithoutEvent("exit", exit_code);
   Unpin();

+ 19 - 1
spec/api-utility-process-spec.ts

@@ -240,13 +240,31 @@ describe('utilityProcess module', () => {
     it('is valid when child process launches successfully', async () => {
       const child = utilityProcess.fork(path.join(fixturesPath, 'empty.js'));
       await once(child, 'spawn');
-      expect(child.pid).to.not.be.null();
+      expect(child).to.have.property('pid').that.is.a('number');
     });
 
     it('is undefined when child process fails to launch', async () => {
       const child = utilityProcess.fork(path.join(fixturesPath, 'does-not-exist.js'));
       expect(child.pid).to.be.undefined();
     });
+
+    it('is undefined before the child process is spawned succesfully', async () => {
+      const child = utilityProcess.fork(path.join(fixturesPath, 'empty.js'));
+      expect(child.pid).to.be.undefined();
+      await once(child, 'spawn');
+      child.kill();
+    });
+
+    it('is undefined when child process is killed', async () => {
+      const child = utilityProcess.fork(path.join(fixturesPath, 'empty.js'));
+      await once(child, 'spawn');
+
+      expect(child).to.have.property('pid').that.is.a('number');
+      expect(child.kill()).to.be.true();
+
+      await once(child, 'exit');
+      expect(child.pid).to.be.undefined();
+    });
   });
 
   describe('stdout property', () => {