diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched.c | 18 | ||||
| -rw-r--r-- | kernel/signal.c | 30 |
2 files changed, 48 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 35373ad017f5..6d0ac320bcbc 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -1837,6 +1837,24 @@ out_unlock: return retval; } +static inline struct task_struct *eldest_child(struct task_struct *p) +{ + if (list_empty(&p->children)) return NULL; + return list_entry(p->children.next,struct task_struct,sibling); +} + +static inline struct task_struct *older_sibling(struct task_struct *p) +{ + if (p->sibling.prev==&p->parent->children) return NULL; + return list_entry(p->sibling.prev,struct task_struct,sibling); +} + +static inline struct task_struct *younger_sibling(struct task_struct *p) +{ + if (p->sibling.next==&p->parent->children) return NULL; + return list_entry(p->sibling.next,struct task_struct,sibling); +} + static void show_task(task_t * p) { unsigned long free = 0; diff --git a/kernel/signal.c b/kernel/signal.c index 961596dd16b2..1379e559bbf4 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -160,6 +160,36 @@ int max_queued_signals = 1024; static int __send_sig_info(int sig, struct siginfo *info, struct task_struct *p); +/* + * Re-calculate pending state from the set of locally pending + * signals, globally pending signals, and blocked signals. + */ +static inline int has_pending_signals(sigset_t *signal, sigset_t *blocked) +{ + unsigned long ready; + long i; + + switch (_NSIG_WORDS) { + default: + for (i = _NSIG_WORDS, ready = 0; --i >= 0 ;) + ready |= signal->sig[i] &~ blocked->sig[i]; + break; + + case 4: ready = signal->sig[3] &~ blocked->sig[3]; + ready |= signal->sig[2] &~ blocked->sig[2]; + ready |= signal->sig[1] &~ blocked->sig[1]; + ready |= signal->sig[0] &~ blocked->sig[0]; + break; + + case 2: ready = signal->sig[1] &~ blocked->sig[1]; + ready |= signal->sig[0] &~ blocked->sig[0]; + break; + + case 1: ready = signal->sig[0] &~ blocked->sig[0]; + } + return ready != 0; +} + #define PENDING(p,b) has_pending_signals(&(p)->signal, (b)) void recalc_sigpending_tsk(struct task_struct *t) |
