support process group
This commit is contained in:
@ -61,6 +61,7 @@ SYSCALL_DELEGATED(102, getuid)
|
||||
SYSCALL_DELEGATED(104, getgid)
|
||||
SYSCALL_DELEGATED(107, geteuid)
|
||||
SYSCALL_DELEGATED(108, getegid)
|
||||
SYSCALL_HANDLED(109, setpgid)
|
||||
SYSCALL_DELEGATED(110, getppid)
|
||||
SYSCALL_DELEGATED(111, getpgrp)
|
||||
SYSCALL_HANDLED(127, rt_sigpending)
|
||||
|
||||
@ -159,6 +159,34 @@ extern unsigned long do_kill(int pid, int tid, int sig);
|
||||
extern void interrupt_syscall(int all, int pid);
|
||||
extern int num_processors;
|
||||
|
||||
void
|
||||
do_setpgid(int pid, int pgid)
|
||||
{
|
||||
struct cpu_local_var *v;
|
||||
struct process *p;
|
||||
struct process *proc = cpu_local_var(current);
|
||||
int i;
|
||||
unsigned long irqstate;
|
||||
|
||||
if(pid == 0)
|
||||
pid = proc->pid;
|
||||
if(pgid == 0)
|
||||
pgid = pid;
|
||||
|
||||
for(i = 0; i < num_processors; i++){
|
||||
v = get_cpu_local_var(i);
|
||||
irqstate = ihk_mc_spinlock_lock(&(v->runq_lock));
|
||||
list_for_each_entry(p, &(v->runq), sched_list){
|
||||
if(p->pid <= 0)
|
||||
continue;
|
||||
if(p->pid == pid){
|
||||
p->pgid = pgid;
|
||||
}
|
||||
}
|
||||
ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
do_signal(unsigned long rc, void *regs0, struct process *proc, struct sig_pending *pending)
|
||||
{
|
||||
@ -319,6 +347,52 @@ do_kill(int pid, int tid, int sig)
|
||||
if(sig > 64 || sig < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if(tid == -1 && pid <= 0){
|
||||
int pgid = -pid;
|
||||
int rc = -ESRCH;
|
||||
int *pids;
|
||||
int i;
|
||||
int n = 0;
|
||||
int sendme = 0;
|
||||
|
||||
pids = kmalloc(sizeof(int) * num_processors, IHK_MC_AP_NOWAIT);
|
||||
if(!pids)
|
||||
return -ENOMEM;
|
||||
if(pid == 0)
|
||||
pgid = proc->pgid;
|
||||
for(i = 0; i < num_processors; i++){
|
||||
v = get_cpu_local_var(i);
|
||||
irqstate = ihk_mc_spinlock_lock(&(v->runq_lock));
|
||||
list_for_each_entry(p, &(v->runq), sched_list){
|
||||
if(p->pid <= 0)
|
||||
continue;
|
||||
if(p->pid == proc->pid){
|
||||
sendme = 1;
|
||||
continue;
|
||||
}
|
||||
if(pgid == 1 || p->pgid == pgid){
|
||||
int j;
|
||||
|
||||
for(j = 0; j < n; j++)
|
||||
if(pids[j] == p->pid)
|
||||
break;
|
||||
if(j == n){
|
||||
pids[n] = p->pid;
|
||||
n++;
|
||||
}
|
||||
}
|
||||
}
|
||||
ihk_mc_spinlock_unlock(&(v->runq_lock), irqstate);
|
||||
}
|
||||
for(i = 0; i < n; i++)
|
||||
rc = do_kill(pids[i], -1, sig);
|
||||
if(sendme)
|
||||
rc = do_kill(proc->pid, -1, sig);
|
||||
|
||||
kfree(pids);
|
||||
return rc;
|
||||
}
|
||||
|
||||
mask = __sigmask(sig);
|
||||
if(tid == -1){
|
||||
struct process *tproc0 = NULL;
|
||||
@ -381,7 +455,6 @@ do_kill(int pid, int tid, int sig)
|
||||
if(sig == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
doint = 0;
|
||||
if(tid == -1){
|
||||
irqstate = ihk_mc_spinlock_lock(&tproc->sigshared->lock);
|
||||
|
||||
Reference in New Issue
Block a user