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