提交 ca86b5dc 编写于 作者: A Al Viro

new helper: get_signal()

On success get_signal_to_deliver() fills k_sigaction and siginfo.
_All_ users pass it addresses of the local variables sitting in
the same function.  Then they proceed to pass those addresses
pretty much in tandem to a bunch of helper functions; again, all
callers of those helpers are passing them such a pair, and one that
had been through get_signal_to_deliver() at that.

The obvious cleanup: introduce a new type that would contain a
<k_sigaction,siginfo> pair (struct ksignal) and begin switching to
using it.  Turns out that it's convenient to store the signal number
in the same object.

New helper, taking that sucker is a wrapper for get_signal_to_deliver();
takes struct ksignal * and returns bool.  On success fills ksignal
with the information for signal handler to be invoked.

For now it's a macro (to avoid header ordering headache), but eventually
it'll be a function in kernel/signal.c, with get_signal_to_deliver()
folded into it.
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 9d94b9e2
...@@ -279,10 +279,28 @@ struct old_sigaction { ...@@ -279,10 +279,28 @@ struct old_sigaction {
}; };
#endif #endif
struct ksignal {
struct k_sigaction ka;
siginfo_t info;
int sig;
};
extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie); extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);
extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping); extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping);
extern void exit_signals(struct task_struct *tsk); extern void exit_signals(struct task_struct *tsk);
/*
* Eventually that'll replace get_signal_to_deliver(); macro for now,
* to avoid nastiness with include order.
*/
#define get_signal(ksig) \
({ \
struct ksignal *p = (ksig); \
p->sig = get_signal_to_deliver(&p->info, &p->ka, \
signal_pt_regs(), NULL);\
p->sig > 0; \
})
extern struct kmem_cache *sighand_cachep; extern struct kmem_cache *sighand_cachep;
int unhandled_signal(struct task_struct *tsk, int sig); int unhandled_signal(struct task_struct *tsk, int sig);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册