b8fceee17a
This simplifies signalfd code, by avoiding it to remain attached to the sighand during its lifetime. In this way, the signalfd remain attached to the sighand only during poll(2) (and select and epoll) and read(2). This also allows to remove all the custom "tsk == current" checks in kernel/signal.c, since dequeue_signal() will only be called by "current". I think this is also what Ben was suggesting time ago. The external effect of this, is that a thread can extract only its own private signals and the group ones. I think this is an acceptable behaviour, in that those are the signals the thread would be able to fetch w/out signalfd. Signed-off-by: Davide Libenzi <davidel@xmailserver.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
65 lines
1.2 KiB
C
65 lines
1.2 KiB
C
/*
|
|
* include/linux/signalfd.h
|
|
*
|
|
* Copyright (C) 2007 Davide Libenzi <davidel@xmailserver.org>
|
|
*
|
|
*/
|
|
|
|
#ifndef _LINUX_SIGNALFD_H
|
|
#define _LINUX_SIGNALFD_H
|
|
|
|
|
|
struct signalfd_siginfo {
|
|
__u32 signo;
|
|
__s32 err;
|
|
__s32 code;
|
|
__u32 pid;
|
|
__u32 uid;
|
|
__s32 fd;
|
|
__u32 tid;
|
|
__u32 band;
|
|
__u32 overrun;
|
|
__u32 trapno;
|
|
__s32 status;
|
|
__s32 svint;
|
|
__u64 svptr;
|
|
__u64 utime;
|
|
__u64 stime;
|
|
__u64 addr;
|
|
|
|
/*
|
|
* Pad strcture to 128 bytes. Remember to update the
|
|
* pad size when you add new memebers. We use a fixed
|
|
* size structure to avoid compatibility problems with
|
|
* future versions, and we leave extra space for additional
|
|
* members. We use fixed size members because this strcture
|
|
* comes out of a read(2) and we really don't want to have
|
|
* a compat on read(2).
|
|
*/
|
|
__u8 __pad[48];
|
|
};
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#ifdef CONFIG_SIGNALFD
|
|
|
|
/*
|
|
* Deliver the signal to listening signalfd.
|
|
*/
|
|
static inline void signalfd_notify(struct task_struct *tsk, int sig)
|
|
{
|
|
if (unlikely(waitqueue_active(&tsk->sighand->signalfd_wqh)))
|
|
wake_up(&tsk->sighand->signalfd_wqh);
|
|
}
|
|
|
|
#else /* CONFIG_SIGNALFD */
|
|
|
|
static inline void signalfd_notify(struct task_struct *tsk, int sig) { }
|
|
|
|
#endif /* CONFIG_SIGNALFD */
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* _LINUX_SIGNALFD_H */
|
|
|