at v2.6.32 3.5 kB view raw
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 12struct timespec; 13struct compat_timespec; 14 15/* 16 * System call restart block. 17 */ 18struct restart_block { 19 long (*fn)(struct restart_block *); 20 union { 21 struct { 22 unsigned long arg0, arg1, arg2, arg3; 23 }; 24 /* For futex_wait and futex_wait_requeue_pi */ 25 struct { 26 u32 *uaddr; 27 u32 val; 28 u32 flags; 29 u32 bitset; 30 u64 time; 31 u32 *uaddr2; 32 } futex; 33 /* For nanosleep */ 34 struct { 35 clockid_t index; 36 struct timespec __user *rmtp; 37#ifdef CONFIG_COMPAT 38 struct compat_timespec __user *compat_rmtp; 39#endif 40 u64 expires; 41 } nanosleep; 42 /* For poll */ 43 struct { 44 struct pollfd __user *ufds; 45 int nfds; 46 int has_timeout; 47 unsigned long tv_sec; 48 unsigned long tv_nsec; 49 } poll; 50 }; 51}; 52 53extern long do_no_restart_syscall(struct restart_block *parm); 54 55#include <linux/bitops.h> 56#include <asm/thread_info.h> 57 58#ifdef __KERNEL__ 59 60/* 61 * flag set/clear/test wrappers 62 * - pass TIF_xxxx constants to these functions 63 */ 64 65static inline void set_ti_thread_flag(struct thread_info *ti, int flag) 66{ 67 set_bit(flag, (unsigned long *)&ti->flags); 68} 69 70static inline void clear_ti_thread_flag(struct thread_info *ti, int flag) 71{ 72 clear_bit(flag, (unsigned long *)&ti->flags); 73} 74 75static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag) 76{ 77 return test_and_set_bit(flag, (unsigned long *)&ti->flags); 78} 79 80static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag) 81{ 82 return test_and_clear_bit(flag, (unsigned long *)&ti->flags); 83} 84 85static inline int test_ti_thread_flag(struct thread_info *ti, int flag) 86{ 87 return test_bit(flag, (unsigned long *)&ti->flags); 88} 89 90#define set_thread_flag(flag) \ 91 set_ti_thread_flag(current_thread_info(), flag) 92#define clear_thread_flag(flag) \ 93 clear_ti_thread_flag(current_thread_info(), flag) 94#define test_and_set_thread_flag(flag) \ 95 test_and_set_ti_thread_flag(current_thread_info(), flag) 96#define test_and_clear_thread_flag(flag) \ 97 test_and_clear_ti_thread_flag(current_thread_info(), flag) 98#define test_thread_flag(flag) \ 99 test_ti_thread_flag(current_thread_info(), flag) 100 101#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) 102#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) 103 104#if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK 105/* 106 * An arch can define its own version of set_restore_sigmask() to get the 107 * job done however works, with or without TIF_RESTORE_SIGMASK. 108 */ 109#define HAVE_SET_RESTORE_SIGMASK 1 110 111/** 112 * set_restore_sigmask() - make sure saved_sigmask processing gets done 113 * 114 * This sets TIF_RESTORE_SIGMASK and ensures that the arch signal code 115 * will run before returning to user mode, to process the flag. For 116 * all callers, TIF_SIGPENDING is already set or it's no harm to set 117 * it. TIF_RESTORE_SIGMASK need not be in the set of bits that the 118 * arch code will notice on return to user mode, in case those bits 119 * are scarce. We set TIF_SIGPENDING here to ensure that the arch 120 * signal code always gets run when TIF_RESTORE_SIGMASK is set. 121 */ 122static inline void set_restore_sigmask(void) 123{ 124 set_thread_flag(TIF_RESTORE_SIGMASK); 125 set_thread_flag(TIF_SIGPENDING); 126} 127#endif /* TIF_RESTORE_SIGMASK && !HAVE_SET_RESTORE_SIGMASK */ 128 129#endif /* __KERNEL__ */ 130 131#endif /* _LINUX_THREAD_INFO_H */