Commit | Line | Data |
---|---|---|
fba2afaa DL |
1 | /* |
2 | * include/linux/signalfd.h | |
3 | * | |
4 | * Copyright (C) 2007 Davide Libenzi <davidel@xmailserver.org> | |
5 | * | |
6 | */ | |
7 | ||
8 | #ifndef _LINUX_SIGNALFD_H | |
9 | #define _LINUX_SIGNALFD_H | |
10 | ||
11 | ||
12 | struct signalfd_siginfo { | |
13 | __u32 signo; | |
14 | __s32 err; | |
15 | __s32 code; | |
16 | __u32 pid; | |
17 | __u32 uid; | |
18 | __s32 fd; | |
19 | __u32 tid; | |
20 | __u32 band; | |
21 | __u32 overrun; | |
22 | __u32 trapno; | |
23 | __s32 status; | |
24 | __s32 svint; | |
25 | __u64 svptr; | |
26 | __u64 utime; | |
27 | __u64 stime; | |
28 | __u64 addr; | |
29 | ||
30 | /* | |
31 | * Pad strcture to 128 bytes. Remember to update the | |
32 | * pad size when you add new memebers. We use a fixed | |
33 | * size structure to avoid compatibility problems with | |
34 | * future versions, and we leave extra space for additional | |
35 | * members. We use fixed size members because this strcture | |
36 | * comes out of a read(2) and we really don't want to have | |
37 | * a compat on read(2). | |
38 | */ | |
39 | __u8 __pad[48]; | |
40 | }; | |
41 | ||
42 | ||
43 | #ifdef __KERNEL__ | |
44 | ||
45 | #ifdef CONFIG_SIGNALFD | |
46 | ||
47 | /* | |
48 | * Deliver the signal to listening signalfd. This must be called | |
49 | * with the sighand lock held. Same are the following that end up | |
50 | * calling signalfd_deliver(). | |
51 | */ | |
52 | void signalfd_deliver(struct task_struct *tsk, int sig); | |
53 | ||
54 | /* | |
55 | * No need to fall inside signalfd_deliver() if no signal listeners | |
56 | * are available. | |
57 | */ | |
58 | static inline void signalfd_notify(struct task_struct *tsk, int sig) | |
59 | { | |
60 | if (unlikely(!list_empty(&tsk->sighand->signalfd_list))) | |
61 | signalfd_deliver(tsk, sig); | |
62 | } | |
63 | ||
64 | /* | |
65 | * The signal -1 is used to notify the signalfd that the sighand | |
66 | * is on its way to be detached. | |
67 | */ | |
68 | static inline void signalfd_detach_locked(struct task_struct *tsk) | |
69 | { | |
70 | if (unlikely(!list_empty(&tsk->sighand->signalfd_list))) | |
71 | signalfd_deliver(tsk, -1); | |
72 | } | |
73 | ||
74 | static inline void signalfd_detach(struct task_struct *tsk) | |
75 | { | |
76 | struct sighand_struct *sighand = tsk->sighand; | |
77 | ||
78 | if (unlikely(!list_empty(&sighand->signalfd_list))) { | |
79 | spin_lock_irq(&sighand->siglock); | |
80 | signalfd_deliver(tsk, -1); | |
81 | spin_unlock_irq(&sighand->siglock); | |
82 | } | |
83 | } | |
84 | ||
85 | #else /* CONFIG_SIGNALFD */ | |
86 | ||
87 | #define signalfd_deliver(t, s) do { } while (0) | |
88 | #define signalfd_notify(t, s) do { } while (0) | |
89 | #define signalfd_detach_locked(t) do { } while (0) | |
90 | #define signalfd_detach(t) do { } while (0) | |
91 | ||
92 | #endif /* CONFIG_SIGNALFD */ | |
93 | ||
94 | #endif /* __KERNEL__ */ | |
95 | ||
96 | #endif /* _LINUX_SIGNALFD_H */ | |
97 |