mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 07:38:10 +00:00
Shell: Avoid waiting for jobs that were *just* unblocked
This fixes the issue with C-z not suspending the job on the first try. ...and further signal issues when the suspended job is contiued.
This commit is contained in:
parent
46661f02c6
commit
dc62371439
4 changed files with 14 additions and 4 deletions
|
@ -93,6 +93,7 @@ int Shell::builtin_bg(int argc, const char** argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
job->set_running_in_background(true);
|
job->set_running_in_background(true);
|
||||||
|
job->set_is_suspended(false);
|
||||||
|
|
||||||
dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")";
|
dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")";
|
||||||
fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters());
|
fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters());
|
||||||
|
@ -339,6 +340,7 @@ int Shell::builtin_fg(int argc, const char** argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
job->set_running_in_background(false);
|
job->set_running_in_background(false);
|
||||||
|
job->set_is_suspended(false);
|
||||||
|
|
||||||
dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")";
|
dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")";
|
||||||
fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters());
|
fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters());
|
||||||
|
|
|
@ -75,6 +75,7 @@ public:
|
||||||
bool should_be_disowned() const { return m_should_be_disowned; }
|
bool should_be_disowned() const { return m_should_be_disowned; }
|
||||||
void disown() { m_should_be_disowned = true; }
|
void disown() { m_should_be_disowned = true; }
|
||||||
bool is_running_in_background() const { return m_running_in_background; }
|
bool is_running_in_background() const { return m_running_in_background; }
|
||||||
|
bool is_suspended() const { return m_is_suspended; }
|
||||||
void unblock() const
|
void unblock() const
|
||||||
{
|
{
|
||||||
if (!m_exited && on_exit)
|
if (!m_exited && on_exit)
|
||||||
|
@ -94,6 +95,8 @@ public:
|
||||||
on_exit(*this);
|
on_exit(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_is_suspended(bool value) const { m_is_suspended = value; }
|
||||||
|
|
||||||
void set_running_in_background(bool running_in_background)
|
void set_running_in_background(bool running_in_background)
|
||||||
{
|
{
|
||||||
m_running_in_background = running_in_background;
|
m_running_in_background = running_in_background;
|
||||||
|
@ -111,5 +114,6 @@ private:
|
||||||
int m_exit_code { -1 };
|
int m_exit_code { -1 };
|
||||||
Core::ElapsedTimer m_command_timer;
|
Core::ElapsedTimer m_command_timer;
|
||||||
mutable bool m_active { true };
|
mutable bool m_active { true };
|
||||||
|
mutable bool m_is_suspended { false };
|
||||||
bool m_should_be_disowned { false };
|
bool m_should_be_disowned { false };
|
||||||
};
|
};
|
||||||
|
|
|
@ -561,16 +561,18 @@ Vector<RefPtr<Job>> Shell::run_commands(Vector<AST::Command>& commands)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
auto job = run_command(command);
|
auto job = run_command(command);
|
||||||
|
if (!job)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (command.should_wait) {
|
if (command.should_wait) {
|
||||||
block_on_job(job);
|
block_on_job(job);
|
||||||
jobs_to_wait_for.append(job);
|
if (!job->is_suspended())
|
||||||
|
jobs_to_wait_for.append(job);
|
||||||
} else {
|
} else {
|
||||||
if (command.is_pipe_source) {
|
if (command.is_pipe_source) {
|
||||||
jobs_to_wait_for.append(job);
|
jobs_to_wait_for.append(job);
|
||||||
} else if (command.should_notify_if_in_background) {
|
} else if (command.should_notify_if_in_background) {
|
||||||
if (job)
|
job->set_running_in_background(true);
|
||||||
job->set_running_in_background(true);
|
|
||||||
restore_stdin();
|
restore_stdin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,8 +121,10 @@ int main(int argc, char** argv)
|
||||||
Core::EventLoop::register_signal(SIGTSTP, [](auto) {
|
Core::EventLoop::register_signal(SIGTSTP, [](auto) {
|
||||||
auto job = s_shell->current_job();
|
auto job = s_shell->current_job();
|
||||||
s_shell->kill_job(job, SIGTSTP);
|
s_shell->kill_job(job, SIGTSTP);
|
||||||
if (job)
|
if (job) {
|
||||||
|
job->set_is_suspended(true);
|
||||||
job->unblock();
|
job->unblock();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
#ifndef __serenity__
|
#ifndef __serenity__
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue