@@ -114,7 +114,16 @@ 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+ dbgln (" Disowning" );
121+ TRY (process.disown ());
122+ } else {
123+ dbgln (" Or not" );
124+ }
125+
126+ return process;
118127}
119128
120129ErrorOr<pid_t > Process::spawn (StringView path, ReadonlySpan<ByteString> arguments, ByteString working_directory, KeepAsChild keep_as_child)
@@ -123,14 +132,9 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<ByteString> argument
123132 .executable = path,
124133 .arguments = Vector<ByteString> { arguments },
125134 .working_directory = working_directory.is_empty () ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
135+ .keep_as_child = keep_as_child,
126136 }));
127137
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- }
134138 return process.m_pid ;
135139}
136140
@@ -145,12 +149,9 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<StringView> argument
145149 .executable = path,
146150 .arguments = backing_strings,
147151 .working_directory = working_directory.is_empty () ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
152+ .keep_as_child = keep_as_child,
148153 }));
149154
150- if (keep_as_child == KeepAsChild::No)
151- TRY (process.disown ());
152- else
153- process.m_should_disown = false ;
154155 return process.m_pid ;
155156}
156157
@@ -165,12 +166,9 @@ ErrorOr<pid_t> Process::spawn(StringView path, ReadonlySpan<char const*> argumen
165166 .executable = path,
166167 .arguments = backing_strings,
167168 .working_directory = working_directory.is_empty () ? Optional<ByteString> {} : Optional<ByteString> { working_directory },
169+ .keep_as_child = keep_as_child,
168170 }));
169171
170- if (keep_as_child == KeepAsChild::No)
171- TRY (process.disown ());
172- else
173- process.m_should_disown = false ;
174172 return process.m_pid ;
175173}
176174
@@ -320,22 +318,20 @@ void Process::wait_for_debugger_and_break()
320318
321319ErrorOr<void > Process::disown ()
322320{
323- if (m_pid != 0 && m_should_disown) {
324321#ifdef AK_OS_SERENITY
325- TRY (System::disown (m_pid));
322+ TRY (System::disown (m_pid));
326323#else
327- // FIXME: Support disown outside Serenity.
324+ // FIXME: Support disown outside Serenity.
328325#endif
329- m_should_disown = false ;
330- return {};
331- } else {
332- return Error::from_errno (EINVAL);
333- }
326+ m_was_managed = true ;
327+ return {};
334328}
335329
336330ErrorOr<bool > Process::wait_for_termination ()
337331{
338332 VERIFY (m_pid > 0 );
333+ VERIFY (!m_was_managed);
334+ m_was_managed = true ;
339335
340336 bool exited_with_code_0 = true ;
341337 int status;
@@ -353,7 +349,6 @@ ErrorOr<bool> Process::wait_for_termination()
353349 VERIFY_NOT_REACHED ();
354350 }
355351
356- m_should_disown = false ;
357352 return exited_with_code_0;
358353}
359354
@@ -457,7 +452,7 @@ ErrorOr<IPCProcess::ProcessPaths> IPCProcess::paths_for_process(StringView proce
457452ErrorOr<IPCProcess::ProcessAndIPCSocket> IPCProcess::spawn_singleton_and_connect_to_process (ProcessSpawnOptions const & options)
458453{
459454 auto [socket_path, pid_path] = TRY (paths_for_process (options.name ));
460- Process process { - 1 } ;
455+ Optional< Process> process;
461456
462457 if (auto existing_pid = TRY (get_process_pid (options.name , pid_path)); existing_pid.has_value ()) {
463458 process = Process { *existing_pid };
@@ -504,7 +499,7 @@ ErrorOr<IPCProcess::ProcessAndIPCSocket> IPCProcess::spawn_singleton_and_connect
504499 auto ipc_socket = TRY (LocalSocket::connect (socket_path));
505500 TRY (ipc_socket->set_blocking (true ));
506501
507- return ProcessAndIPCSocket { move ( process), move (ipc_socket) };
502+ return ProcessAndIPCSocket { process. release_value ( ), move (ipc_socket) };
508503}
509504
510505}
0 commit comments