bit more stable

This commit is contained in:
Jack Halford 2016-12-18 13:13:01 +01:00
parent 72b9e72fc8
commit 40378fec73
15 changed files with 40 additions and 24 deletions

View file

@ -57,7 +57,7 @@ int job_addprocess(t_process *p);
void job_update_id(void); void job_update_id(void);
void job_update_rank(void); void job_update_rank(void);
void do_job_notification(void); int do_job_notification(void);
void job_notify_new(t_job *job); void job_notify_new(t_job *job);
void job_notify_change(t_job *job, int status); void job_notify_change(t_job *job, int status);
@ -65,7 +65,7 @@ int job_wait(t_job *job);
void job_update_status(void); void job_update_status(void);
int job_is_stopped(t_job *job); int job_is_stopped(t_job *job);
int job_is_completed(t_job *job); int job_is_completed(t_job *job);
void job_remove(t_job *job); void job_remove(int id);
void job_free(void *content, size_t content_size); void job_free(void *content, size_t content_size);
int process_mark_status(pid_t pid, int status); int process_mark_status(pid_t pid, int status);

View file

@ -39,5 +39,7 @@ int exec_command(t_btree **ast)
put_job_in_background(job, 0); put_job_in_background(job, 0);
} }
btree_delone(ast, &ast_free); btree_delone(ast, &ast_free);
p->path = NULL;
p->attributes = 0;
return (0); return (0);
} }

View file

@ -20,10 +20,14 @@ int launch_process(t_process *p)
exec = &data_singleton()->exec; exec = &data_singleton()->exec;
if (p->attributes & PROCESS_UNKNOWN) if (p->attributes & PROCESS_UNKNOWN)
ft_dprintf(2, "%s: command not found: %s\n", SHELL_NAME, p->argv[0]); ft_dprintf(2, "%s: command not found: %s\n", SHELL_NAME, p->argv[0]);
else if (p->attributes & PROCESS_BUILTIN && p->fdout != STDOUT) else if (p->attributes & PROCESS_BUILTIN && p->fdout == STDOUT)
{
DG("process is not to be forked, fdout=%i, attr=%x", p->fdout, p->attributes);
set_exitstatus((*p->execf)(p->path, p->argv, data_singleton()->env)); set_exitstatus((*p->execf)(p->path, p->argv, data_singleton()->env));
}
else else
{ {
DG("process is to be forked, fdout=%i, attr=%x", p->fdout, p->attributes);
if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT) if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT)
&& access(p->path, X_OK) == -1) && access(p->path, X_OK) == -1)
{ {

View file

@ -17,13 +17,13 @@ int process_setexec(t_process *p)
if ((p->execf = is_builtin(p))) if ((p->execf = is_builtin(p)))
{ {
DG("process is a builtin"); DG("process is a builtin");
p->attributes &= PROCESS_BUILTIN; p->attributes |= PROCESS_BUILTIN;
} }
else if (ft_strchr(p->argv[0], '/')) else if (ft_strchr(p->argv[0], '/'))
{ {
DG("process is a script"); DG("process is a script");
p->execf = &execve; p->execf = &execve;
p->attributes &= PROCESS_SCRIPT; p->attributes |= PROCESS_SCRIPT;
p->path = ft_strdup(p->argv[0]); p->path = ft_strdup(p->argv[0]);
} }
else if ((p->path = ft_findexec(ft_getenv( else if ((p->path = ft_findexec(ft_getenv(
@ -31,13 +31,13 @@ int process_setexec(t_process *p)
{ {
DG("process is binary"); DG("process is binary");
p->execf = &execve; p->execf = &execve;
p->attributes &= PROCESS_BINARY; p->attributes |= PROCESS_BINARY;
} }
else else
{ {
DG("process is '%s' unknown type", p->argv[0]); DG("process is '%s' unknown type", p->argv[0]);
p->execf = NULL; p->execf = NULL;
p->attributes &= PROCESS_UNKNOWN; p->attributes |= PROCESS_UNKNOWN;
return (1); return (1);
} }
return (0); return (0);

View file

@ -26,6 +26,7 @@ int builtin_jobs(const char *path, char *const av[], char *const envp[])
(void)av; (void)av;
while (jlist) while (jlist)
{ {
DG("jlist->content");
job = jlist->content; job = jlist->content;
rank = ' '; rank = ' ';
if (job->id == data_singleton()->jobc.rank[0]) if (job->id == data_singleton()->jobc.rank[0])

View file

@ -12,12 +12,14 @@
#include "job_control.h" #include "job_control.h"
void do_job_notification(void) int do_job_notification(void)
{ {
t_job *j; t_job *j;
t_list *jlist; t_list *jlist;
t_jobc *jobc; t_jobc *jobc;
int ret;
ret = 0;
job_update_status(); job_update_status();
jobc = &data_singleton()->jobc; jobc = &data_singleton()->jobc;
jlist = jobc->first_job; jlist = jobc->first_job;
@ -27,14 +29,17 @@ void do_job_notification(void)
DG("checking job [%i]", j->id); DG("checking job [%i]", j->id);
if (job_is_completed(j)) if (job_is_completed(j))
{ {
ret = 1;
job_notify_change(j, 0); job_notify_change(j, 0);
job_remove(j); job_remove(j->id);
} }
else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED)) else if (job_is_stopped(j) && !(j->attributes & JOB_NOTIFIED))
{ {
ret = 1;
job_notify_change(j, 8); job_notify_change(j, 8);
j->attributes &= JOB_NOTIFIED; j->attributes &= JOB_NOTIFIED;
} }
jlist = jlist->next; jlist = jlist->next;
} }
return (ret);
} }

View file

@ -22,7 +22,10 @@ int job_is_completed(t_job *job)
{ {
p = lst->content; p = lst->content;
if (!(p->attributes & PROCESS_COMPLETED)) if (!(p->attributes & PROCESS_COMPLETED))
{
DG("process %i is not completed", p->pid);
return (0); return (0);
}
lst = lst->next; lst = lst->next;
} }
return (1); return (1);

View file

@ -30,5 +30,5 @@ void job_notify_change(t_job *job, int status)
ft_printf("{red}killed{mag}"); ft_printf("{red}killed{mag}");
else else
ft_printf("exit %i", status); ft_printf("exit %i", status);
/* ft_printf("\t%s{eoc}\n", job->command); */ ft_printf("\t 'process command goes here'{eoc}\n");
} }

View file

@ -12,17 +12,18 @@
#include "job_control.h" #include "job_control.h"
void job_remove(t_job *job) void job_remove(int id)
{ {
t_jobc *jobc; t_jobc *jobc;
jobc = &data_singleton()->jobc; jobc = &data_singleton()->jobc;
if (job->id < data_singleton()->jobc.current_id) DG("job_remove");
if (id < data_singleton()->jobc.current_id)
{ {
data_singleton()->jobc.current_id = job->id; data_singleton()->jobc.current_id = id;
DG("ID_UPDATE(downgrade):%i", job->id); DG("ID_UPDATE(downgrade):%i", id);
} }
else else
DG("ID_UPDATE(no downgrade): %i/%i", job->id, data_singleton()->jobc.current_id); DG("ID_UPDATE(no downgrade): %i/%i", id, data_singleton()->jobc.current_id);
ft_lst_delif(&jobc->first_job, job, ft_addrcmp, job_free); ft_lst_delif(&jobc->first_job, &id, job_cmp_id, job_free);
} }

View file

@ -18,7 +18,9 @@ void process_free(void *content, size_t content_size)
(void)content_size; (void)content_size;
p = content; p = content;
DG("check 1");
ft_strdel(&p->path); ft_strdel(&p->path);
DG("check 2");
ft_sstrfree(p->argv); ft_sstrfree(p->argv);
free(p); free(p);
} }

View file

@ -24,10 +24,10 @@ int process_mark_status(pid_t pid, int status)
DG("found process pid=%i", pid); DG("found process pid=%i", pid);
p->status = status; p->status = status;
if (WIFSTOPPED(status)) if (WIFSTOPPED(status))
p->attributes &= PROCESS_STOPPED; p->attributes |= PROCESS_STOPPED;
else else
{ {
p->attributes &= PROCESS_COMPLETED; p->attributes |= PROCESS_COMPLETED;
if (WIFSIGNALED(status)) if (WIFSIGNALED(status))
ft_printf("%d: Terminated by signal %d.\n", ft_printf("%d: Terminated by signal %d.\n",
(int) pid, WTERMSIG(p->status)); (int) pid, WTERMSIG(p->status));

View file

@ -27,10 +27,8 @@ int put_job_in_foreground(t_job *job, int cont)
perror("kill (SIGCONT)"); perror("kill (SIGCONT)");
} }
/* Wait for it to report. */ /* Wait for it to report. */
DG("gonna wait for job");
job_wait(job); job_wait(job);
DG("gonna remove job"); job_remove(job->id);
job_remove(job);
/* Put the shell back in the foreground. */ /* Put the shell back in the foreground. */
tcsetpgrp(STDIN_FILENO, jobc->shell_pgid); tcsetpgrp(STDIN_FILENO, jobc->shell_pgid);

View file

@ -19,5 +19,7 @@ void sigchld_handler(int signo)
(void)signo; (void)signo;
data = data_singleton(); data = data_singleton();
DG("got asynchronous notification (SIGCHLD)"); DG("got asynchronous notification (SIGCHLD)");
/* if (do_job_notification()) */
/* ft_putstr(SHELL_PROMPT); */
job_update_status(); job_update_status();
} }

View file

@ -14,9 +14,7 @@
int ft_prompt(void) int ft_prompt(void)
{ {
t_data *data; DG("do_job_notification() before prompt");
data = data_singleton();
do_job_notification(); do_job_notification();
DG("new prompt now"); DG("new prompt now");
ft_putstr(SHELL_PROMPT); ft_putstr(SHELL_PROMPT);