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