Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
thread_info.h
Go to the documentation of this file.
1 /* thread_info.h: common low-level thread information accessors
2  *
3  * Copyright (C) 2002 David Howells ([email protected])
4  * - Incorporating suggestions made by Linus Torvalds
5  */
6 
7 #ifndef _LINUX_THREAD_INFO_H
8 #define _LINUX_THREAD_INFO_H
9 
10 #include <linux/types.h>
11 #include <linux/bug.h>
12 
13 struct timespec;
14 struct compat_timespec;
15 
16 /*
17  * System call restart block.
18  */
19 struct restart_block {
20  long (*fn)(struct restart_block *);
21  union {
22  /* For futex_wait and futex_wait_requeue_pi */
23  struct {
30  } futex;
31  /* For nanosleep */
32  struct {
34  struct timespec __user *rmtp;
35 #ifdef CONFIG_COMPAT
36  struct compat_timespec __user *compat_rmtp;
37 #endif
39  } nanosleep;
40  /* For poll */
41  struct {
42  struct pollfd __user *ufds;
43  int nfds;
45  unsigned long tv_sec;
46  unsigned long tv_nsec;
47  } poll;
48  };
49 };
50 
51 extern long do_no_restart_syscall(struct restart_block *parm);
52 
53 #include <linux/bitops.h>
54 #include <asm/thread_info.h>
55 
56 #ifdef __KERNEL__
57 
58 #ifdef CONFIG_DEBUG_STACK_USAGE
59 # define THREADINFO_GFP (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
60 #else
61 # define THREADINFO_GFP (GFP_KERNEL | __GFP_NOTRACK)
62 #endif
63 
64 /*
65  * flag set/clear/test wrappers
66  * - pass TIF_xxxx constants to these functions
67  */
68 
69 static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
70 {
71  set_bit(flag, (unsigned long *)&ti->flags);
72 }
73 
74 static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
75 {
76  clear_bit(flag, (unsigned long *)&ti->flags);
77 }
78 
79 static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
80 {
81  return test_and_set_bit(flag, (unsigned long *)&ti->flags);
82 }
83 
84 static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
85 {
86  return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
87 }
88 
89 static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
90 {
91  return test_bit(flag, (unsigned long *)&ti->flags);
92 }
93 
94 #define set_thread_flag(flag) \
95  set_ti_thread_flag(current_thread_info(), flag)
96 #define clear_thread_flag(flag) \
97  clear_ti_thread_flag(current_thread_info(), flag)
98 #define test_and_set_thread_flag(flag) \
99  test_and_set_ti_thread_flag(current_thread_info(), flag)
100 #define test_and_clear_thread_flag(flag) \
101  test_and_clear_ti_thread_flag(current_thread_info(), flag)
102 #define test_thread_flag(flag) \
103  test_ti_thread_flag(current_thread_info(), flag)
104 
105 #define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
106 #define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED)
107 
108 #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK
109 /*
110  * An arch can define its own version of set_restore_sigmask() to get the
111  * job done however works, with or without TIF_RESTORE_SIGMASK.
112  */
113 #define HAVE_SET_RESTORE_SIGMASK 1
114 
126 static inline void set_restore_sigmask(void)
127 {
128  set_thread_flag(TIF_RESTORE_SIGMASK);
129  WARN_ON(!test_thread_flag(TIF_SIGPENDING));
130 }
131 static inline void clear_restore_sigmask(void)
132 {
133  clear_thread_flag(TIF_RESTORE_SIGMASK);
134 }
135 static inline bool test_restore_sigmask(void)
136 {
137  return test_thread_flag(TIF_RESTORE_SIGMASK);
138 }
139 static inline bool test_and_clear_restore_sigmask(void)
140 {
141  return test_and_clear_thread_flag(TIF_RESTORE_SIGMASK);
142 }
143 #endif /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */
144 
145 #ifndef HAVE_SET_RESTORE_SIGMASK
146 #error "no set_restore_sigmask() provided and default one won't work"
147 #endif
148 
149 #endif /* __KERNEL__ */
150 
151 #endif /* _LINUX_THREAD_INFO_H */