00001 #include <agnix/agnix.h>
00002 #include <agnix/tasks.h>
00003 #include <agnix/threads.h>
00004 #include <agnix/signals.h>
00005 #include <agnix/memory.h>
00006 #include <agnix/console.h>
00007 #include <agnix/unistd.h>
00008
00009 #define MOD_NAME "SIG: "
00010
00011 int execute_signal_sigaction(struct regs_s *regs, struct sigaction_s *sigaction, int sig_nr)
00012 {
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 return 0;
00038 }
00039
00040 int execute_signals(struct task_s *task, struct regs_s *regs)
00041 {
00042 struct signal_s *signal;
00043 void (* sa_handler)(int);
00044 int sig_nr;
00045
00046 signal = signal_dequeue(task);
00047 sig_nr = signal->signal_nr;
00048
00049 printk(MOD_NAME "dequeued signal nr %d %x\n", signal->signal_nr, regs->eip);
00050
00051 switch(signal->signal_nr) {
00052
00053 case SIGSTOP:
00054 task->t_state &= ~TASK_STAT_RUNNING;
00055 break;
00056
00057 case SIGKILL:
00058 task->t_state |= TASK_STAT_KILLED;
00059 do_task_exit(task, 0);
00060 break;
00061
00062 default:
00063 if (USER_THREAD(task)) {
00064 execute_signal_sigaction(regs, &(task->signals_act.sigaction[sig_nr]), sig_nr);
00065 }
00066 else {
00067 sa_handler = task->signals_act.sigaction[sig_nr].sa_handler;
00068
00069 if (sa_handler)
00070 sa_handler(sig_nr);
00071 }
00072 }
00073
00074 put_free_pages((u32)signal, 0);
00075
00076 return 0;
00077 }