xref: /linux/include/linux/thread_info.h (revision ed3174d93c342b8b2eeba6bbd124707d55304a7b)
1 /* thread_info.h: common low-level thread information accessors
2  *
3  * Copyright (C) 2002  David Howells (dhowells@redhat.com)
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 
12 /*
13  * System call restart block.
14  */
15 struct restart_block {
16 	long (*fn)(struct restart_block *);
17 	union {
18 		struct {
19 			unsigned long arg0, arg1, arg2, arg3;
20 		};
21 		/* For futex_wait */
22 		struct {
23 			u32 *uaddr;
24 			u32 val;
25 			u32 flags;
26 			u32 bitset;
27 			u64 time;
28 		} futex;
29 	};
30 };
31 
32 extern long do_no_restart_syscall(struct restart_block *parm);
33 
34 #include <linux/bitops.h>
35 #include <asm/thread_info.h>
36 
37 #ifdef __KERNEL__
38 
39 /*
40  * flag set/clear/test wrappers
41  * - pass TIF_xxxx constants to these functions
42  */
43 
44 static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
45 {
46 	set_bit(flag, (unsigned long *)&ti->flags);
47 }
48 
49 static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
50 {
51 	clear_bit(flag, (unsigned long *)&ti->flags);
52 }
53 
54 static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
55 {
56 	return test_and_set_bit(flag, (unsigned long *)&ti->flags);
57 }
58 
59 static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
60 {
61 	return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
62 }
63 
64 static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
65 {
66 	return test_bit(flag, (unsigned long *)&ti->flags);
67 }
68 
69 #define set_thread_flag(flag) \
70 	set_ti_thread_flag(current_thread_info(), flag)
71 #define clear_thread_flag(flag) \
72 	clear_ti_thread_flag(current_thread_info(), flag)
73 #define test_and_set_thread_flag(flag) \
74 	test_and_set_ti_thread_flag(current_thread_info(), flag)
75 #define test_and_clear_thread_flag(flag) \
76 	test_and_clear_ti_thread_flag(current_thread_info(), flag)
77 #define test_thread_flag(flag) \
78 	test_ti_thread_flag(current_thread_info(), flag)
79 
80 #define set_need_resched()	set_thread_flag(TIF_NEED_RESCHED)
81 #define clear_need_resched()	clear_thread_flag(TIF_NEED_RESCHED)
82 
83 #endif
84 
85 #endif /* _LINUX_THREAD_INFO_H */
86