@@ -114,7 +114,12 @@ ErrorOr<Process> Process::spawn(ProcessSpawnOptions const& options)
114114 } else {
115115 pid = TRY (System::posix_spawn (options.executable .view (), &spawn_actions, nullptr , const_cast <char **>(argv_list.get ().data ()), Core::Environment::raw_environ ()));
116116 }
117- return Process { pid };
117+
118+ auto process = Process { pid };
119+ if (options.keep_as_child == KeepAsChild::No)
120+ TRY (process.disown ());
121+
122+ return process;
118123}
119124
120125ErrorOr<pid_t > Process::spawn (StringView path, ReadonlySpan<ByteString> arguments, ByteString working_directory, KeepAsChild keep_as_child)
@@ -123,15 +128,10 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<ByteString> argument
123128 .executable = path,
124129 .arguments = Vector<ByteString> { arguments },
125130 .working_directory = working_directory.is_empty () ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
131+ .keep_as_child = keep_as_child,
126132 }));
127133
128- if (keep_as_child == KeepAsChild::No)
129- TRY (process.disown ());
130- else {
131- // FIXME: This won't be needed if return value is changed to Process.
132- process.m_should_disown = false ;
133- }
134- return process.pid ();
134+ return process.m_pid ;
135135}
136136
137137ErrorOr<pid_t > Process::spawn (StringView path, ReadonlySpan<StringView> arguments, ByteString working_directory, KeepAsChild keep_as_child)
@@ -145,13 +145,10 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<StringView> argument
145145 .executable = path,
146146 .arguments = backing_strings,
147147 .working_directory = working_directory.is_empty () ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
148+ .keep_as_child = keep_as_child,
148149 }));
149150
150- if (keep_as_child == KeepAsChild::No)
151- TRY (process.disown ());
152- else
153- process.m_should_disown = false ;
154- return process.pid ();
151+ return process.m_pid ;
155152}
156153
157154ErrorOr<pid_t > Process::spawn (StringView path, ReadonlySpan<char const *> arguments, ByteString working_directory, KeepAsChild keep_as_child)
@@ -165,13 +162,10 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<char const*> argumen
165162 .executable = path,
166163 .arguments = backing_strings,
167164 .working_directory = working_directory.is_empty () ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
165+ .keep_as_child = keep_as_child,
168166 }));
169167
170- if (keep_as_child == KeepAsChild::No)
171- TRY (process.disown ());
172- else
173- process.m_should_disown = false ;
174- return process.pid ();
168+ return process.m_pid ;
175169}
176170
177171ErrorOr<String> Process::get_name ()
@@ -320,22 +314,20 @@ void Process::wait_for_debugger_and_break()
320314
321315ErrorOr<void > Process::disown ()
322316{
323- if (m_pid != 0 && m_should_disown) {
324317#ifdef AK_OS_SERENITY
325- TRY (System::disown (m_pid));
318+ TRY (System::disown (m_pid));
326319#else
327- // FIXME: Support disown outside Serenity.
320+ // FIXME: Support disown outside Serenity.
328321#endif
329- m_should_disown = false ;
330- return {};
331- } else {
332- return Error::from_errno (EINVAL);
333- }
322+ m_was_managed = true ;
323+ return {};
334324}
335325
336326ErrorOr<bool > Process::wait_for_termination ()
337327{
338328 VERIFY (m_pid > 0 );
329+ VERIFY (!m_was_managed);
330+ m_was_managed = true ;
339331
340332 bool exited_with_code_0 = true ;
341333 int status;
@@ -353,7 +345,6 @@ ErrorOr<bool> Process::wait_for_termination()
353345 VERIFY_NOT_REACHED ();
354346 }
355347
356- m_should_disown = false ;
357348 return exited_with_code_0;
358349}
359350
@@ -457,7 +448,7 @@ ErrorOr<IPCProcess::ProcessPaths> IPCProcess::paths_for_process(StringView proce
457448ErrorOr<IPCProcess::ProcessAndIPCSocket> IPCProcess::spawn_singleton_and_connect_to_process (ProcessSpawnOptions const & options)
458449{
459450 auto [socket_path, pid_path] = TRY (paths_for_process (options.name ));
460- Process process { - 1 } ;
451+ Optional< Process> process;
461452
462453 if (auto existing_pid = TRY (get_process_pid (options.name , pid_path)); existing_pid.has_value ()) {
463454 process = Process { *existing_pid };
@@ -485,7 +476,7 @@ ErrorOr<IPCProcess::ProcessAndIPCSocket> IPCProcess::spawn_singleton_and_connect
485476 auto process = TRY (Process::spawn (options));
486477 {
487478 auto pid_file = TRY (File::open (pid_path, File::OpenMode::Write));
488- TRY (pid_file->write_until_depleted (ByteString::number (process.pid () )));
479+ TRY (pid_file->write_until_depleted (ByteString::number (process.m_pid )));
489480 }
490481
491482 TRY (System::kill (getpid (), SIGTERM));
@@ -504,7 +495,7 @@ ErrorOr<IPCProcess::ProcessAndIPCSocket> IPCProcess::spawn_singleton_and_connect
504495 auto ipc_socket = TRY (LocalSocket::connect (socket_path));
505496 TRY (ipc_socket->set_blocking (true ));
506497
507- return ProcessAndIPCSocket { move ( process), move (ipc_socket) };
498+ return ProcessAndIPCSocket { process. release_value ( ), move (ipc_socket) };
508499}
509500
510501}
0 commit comments