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