sched.h
来自「此工具是arm-linux-GCC交叉编译工具(cross-3.4.4)」· C头文件 代码 · 共 1,398 行 · 第 1/3 页
H
1,398 行
/* * The default (Linux) execution domain. */extern struct exec_domain default_exec_domain;union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)];};#ifndef __HAVE_ARCH_KSTACK_ENDstatic inline int kstack_end(void *addr){ /* Reliable end of stack detection: * Some APM bios versions misalign the stack */ return !(((unsigned long)addr+sizeof(void*)-1) & (THREAD_SIZE-sizeof(void*)));}#endifextern union thread_union init_thread_union;extern struct task_struct init_task;extern struct mm_struct init_mm;#define find_task_by_pid(nr) find_task_by_pid_type(PIDTYPE_PID, nr)extern struct task_struct *find_task_by_pid_type(int type, int pid);extern void set_special_pids(pid_t session, pid_t pgrp);extern void __set_special_pids(pid_t session, pid_t pgrp);/* per-UID process charging. */extern struct user_struct * alloc_uid(uid_t);static inline struct user_struct *get_uid(struct user_struct *u){ atomic_inc(&u->__count); return u;}extern void free_uid(struct user_struct *);extern void switch_uid(struct user_struct *);#include <asm/current.h>extern void do_timer(struct pt_regs *);extern int FASTCALL(wake_up_state(struct task_struct * tsk, unsigned int state));extern int FASTCALL(wake_up_process(struct task_struct * tsk));extern void FASTCALL(wake_up_new_task(struct task_struct * tsk, unsigned long clone_flags));#ifdef CONFIG_SMP extern void kick_process(struct task_struct *tsk);#else static inline void kick_process(struct task_struct *tsk) { }#endifextern void FASTCALL(sched_fork(task_t * p, int clone_flags));extern void FASTCALL(sched_exit(task_t * p));extern int in_group_p(gid_t);extern int in_egroup_p(gid_t);extern void proc_caches_init(void);extern void flush_signals(struct task_struct *);extern void flush_signal_handlers(struct task_struct *, int force_default);extern int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info);static inline int dequeue_signal_lock(struct task_struct *tsk, sigset_t *mask, siginfo_t *info){ unsigned long flags; int ret; spin_lock_irqsave(&tsk->sighand->siglock, flags); ret = dequeue_signal(tsk, mask, info); spin_unlock_irqrestore(&tsk->sighand->siglock, flags); return ret;} extern void block_all_signals(int (*notifier)(void *priv), void *priv, sigset_t *mask);extern void unblock_all_signals(void);extern void release_task(struct task_struct * p);extern int send_sig_info(int, struct siginfo *, struct task_struct *);extern int send_group_sig_info(int, struct siginfo *, struct task_struct *);extern int force_sigsegv(int, struct task_struct *);extern int force_sig_info(int, struct siginfo *, struct task_struct *);extern int __kill_pg_info(int sig, struct siginfo *info, pid_t pgrp);extern int kill_pg_info(int, struct siginfo *, pid_t);extern int kill_proc_info(int, struct siginfo *, pid_t);extern int kill_proc_info_as_uid(int, struct siginfo *, pid_t, uid_t, uid_t);extern void do_notify_parent(struct task_struct *, int);extern void force_sig(int, struct task_struct *);extern void force_sig_specific(int, struct task_struct *);extern int send_sig(int, struct task_struct *, int);extern void zap_other_threads(struct task_struct *p);extern int kill_pg(pid_t, int, int);extern int kill_sl(pid_t, int, int);extern int kill_proc(pid_t, int, int);extern struct sigqueue *sigqueue_alloc(void);extern void sigqueue_free(struct sigqueue *);extern int send_sigqueue(int, struct sigqueue *, struct task_struct *);extern int send_group_sigqueue(int, struct sigqueue *, struct task_struct *);extern int do_sigaction(int, const struct k_sigaction *, struct k_sigaction *);extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long);/* These can be the second arg to send_sig_info/send_group_sig_info. */#define SEND_SIG_NOINFO ((struct siginfo *) 0)#define SEND_SIG_PRIV ((struct siginfo *) 1)#define SEND_SIG_FORCED ((struct siginfo *) 2)/* True if we are on the alternate signal stack. */static inline int on_sig_stack(unsigned long sp){ return (sp - current->sas_ss_sp < current->sas_ss_size);}static inline int sas_ss_flags(unsigned long sp){ return (current->sas_ss_size == 0 ? SS_DISABLE : on_sig_stack(sp) ? SS_ONSTACK : 0);}#ifdef CONFIG_SECURITY/* code is in security.c */extern int capable(int cap);#elsestatic inline int capable(int cap){ if (cap_raised(current->cap_effective, cap)) { current->flags |= PF_SUPERPRIV; return 1; } return 0;}#endif/* * Routines for handling mm_structs */extern struct mm_struct * mm_alloc(void);/* mmdrop drops the mm and the page tables */extern void FASTCALL(__mmdrop(struct mm_struct *));static inline void mmdrop(struct mm_struct * mm){ if (atomic_dec_and_test(&mm->mm_count)) __mmdrop(mm);}/* mmput gets rid of the mappings and all user-space */extern void mmput(struct mm_struct *);/* Grab a reference to a task's mm, if it is not already going away */extern struct mm_struct *get_task_mm(struct task_struct *task);/* Remove the current tasks stale references to the old mm_struct */extern void mm_release(struct task_struct *, struct mm_struct *);extern int copy_thread(int, unsigned long, unsigned long, unsigned long, struct task_struct *, struct pt_regs *);extern void flush_thread(void);extern void exit_thread(void);extern void exit_files(struct task_struct *);extern void exit_signal(struct task_struct *);extern void __exit_signal(struct task_struct *);extern void exit_sighand(struct task_struct *);extern void __exit_sighand(struct task_struct *);extern void exit_itimers(struct signal_struct *);extern NORET_TYPE void do_group_exit(int);extern void daemonize(const char *, ...);extern int allow_signal(int);extern int disallow_signal(int);extern task_t *child_reaper;extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *);extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *);task_t *fork_idle(int);extern void set_task_comm(struct task_struct *tsk, char *from);extern void get_task_comm(char *to, struct task_struct *tsk);#ifdef CONFIG_SMPextern void wait_task_inactive(task_t * p);#else#define wait_task_inactive(p) do { } while (0)#endif#define remove_parent(p) list_del_init(&(p)->sibling)#define add_parent(p, parent) list_add_tail(&(p)->sibling,&(parent)->children)#define REMOVE_LINKS(p) do { \ if (thread_group_leader(p)) \ list_del_init(&(p)->tasks); \ remove_parent(p); \ } while (0)#define SET_LINKS(p) do { \ if (thread_group_leader(p)) \ list_add_tail(&(p)->tasks,&init_task.tasks); \ add_parent(p, (p)->parent); \ } while (0)#define next_task(p) list_entry((p)->tasks.next, struct task_struct, tasks)#define prev_task(p) list_entry((p)->tasks.prev, struct task_struct, tasks)#define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; )/* * Careful: do_each_thread/while_each_thread is a double loop so * 'break' will not work as expected - use goto instead. */#define do_each_thread(g, t) \ for (g = t = &init_task ; (g = t = next_task(g)) != &init_task ; ) do#define while_each_thread(g, t) \ while ((t = next_thread(t)) != g)extern task_t * FASTCALL(next_thread(const task_t *p));#define thread_group_leader(p) (p->pid == p->tgid)static inline int thread_group_empty(task_t *p){ return list_empty(&p->pids[PIDTYPE_TGID].pid_list);}#define delay_group_leader(p) \ (thread_group_leader(p) && !thread_group_empty(p))extern void unhash_process(struct task_struct *p);/* * Protects ->fs, ->files, ->mm, ->ptrace, ->group_info, ->comm, keyring * subscriptions and synchronises with wait4(). Also used in procfs. Also * pins the final release of task.io_context. * * Nests both inside and outside of read_lock(&tasklist_lock). * It must not be nested with write_lock_irq(&tasklist_lock), * neither inside nor outside. */static inline void task_lock(struct task_struct *p){ spin_lock(&p->alloc_lock);}static inline void task_unlock(struct task_struct *p){ spin_unlock(&p->alloc_lock);}/* set thread flags in other task's structures * - see asm/thread_info.h for TIF_xxxx flags available */static inline void set_tsk_thread_flag(struct task_struct *tsk, int flag){ set_ti_thread_flag(tsk->thread_info,flag);}static inline void clear_tsk_thread_flag(struct task_struct *tsk, int flag){ clear_ti_thread_flag(tsk->thread_info,flag);}static inline int test_and_set_tsk_thread_flag(struct task_struct *tsk, int flag){ return test_and_set_ti_thread_flag(tsk->thread_info,flag);}static inline int test_and_clear_tsk_thread_flag(struct task_struct *tsk, int flag){ return test_and_clear_ti_thread_flag(tsk->thread_info,flag);}static inline int test_tsk_thread_flag(struct task_struct *tsk, int flag){ return test_ti_thread_flag(tsk->thread_info,flag);}static inline void set_tsk_need_resched(struct task_struct *tsk){ set_tsk_thread_flag(tsk,TIF_NEED_RESCHED);}static inline void clear_tsk_need_resched(struct task_struct *tsk){ clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED);}static inline int signal_pending(struct task_struct *p){ return unlikely(test_tsk_thread_flag(p,TIF_SIGPENDING));} static inline int need_resched(void){ return unlikely(test_thread_flag(TIF_NEED_RESCHED));}/* * cond_resched() and cond_resched_lock(): latency reduction via * explicit rescheduling in places that are safe. The return * value indicates whether a reschedule was done in fact. * cond_resched_lock() will drop the spinlock before scheduling, * cond_resched_softirq() will enable bhs before scheduling. */extern int cond_resched(void);extern int cond_resched_lock(spinlock_t * lock);extern int cond_resched_softirq(void);/* * Does a critical section need to be broken due to another * task waiting?: */#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)# define need_lockbreak(lock) ((lock)->break_lock)#else# define need_lockbreak(lock) 0#endif/* * Does a critical section need to be broken due to another * task waiting or preemption being signalled: */static inline int lock_need_resched(spinlock_t *lock){ if (need_lockbreak(lock) || need_resched()) return 1; return 0;}/* Reevaluate whether the task has signals pending delivery. This is required every time the blocked sigset_t changes. callers must hold sighand->siglock. */extern FASTCALL(void recalc_sigpending_tsk(struct task_struct *t));extern void recalc_sigpending(void);extern void signal_wake_up(struct task_struct *t, int resume_stopped);/* * Wrappers for p->thread_info->cpu access. No-op on UP. */#ifdef CONFIG_SMPstatic inline unsigned int task_cpu(const struct task_struct *p){ return p->thread_info->cpu;}static inline void set_task_cpu(struct task_struct *p, unsigned int cpu){ p->thread_info->cpu = cpu;}#elsestatic inline unsigned int task_cpu(const struct task_struct *p){ return 0;}static inline void set_task_cpu(struct task_struct *p, unsigned int cpu){}#endif /* CONFIG_SMP */#ifdef HAVE_ARCH_PICK_MMAP_LAYOUTextern void arch_pick_mmap_layout(struct mm_struct *mm);#elsestatic inline void arch_pick_mmap_layout(struct mm_struct *mm){ mm->mmap_base = TASK_UNMAPPED_BASE; mm->get_unmapped_area = arch_get_unmapped_area; mm->unmap_area = arch_unmap_area;}#endifextern long sched_setaffinity(pid_t pid, cpumask_t new_mask);extern long sched_getaffinity(pid_t pid, cpumask_t *mask);#ifdef CONFIG_MAGIC_SYSRQextern void normalize_rt_tasks(void);#endif#ifdef CONFIG_PM/* * Check if a process has been frozen */static inline int frozen(struct task_struct *p){ return p->flags & PF_FROZEN;}/* * Check if there is a request to freeze a process */static inline int freezing(struct task_struct *p){ return p->flags & PF_FREEZE;}/* * Request that a process be frozen * FIXME: SMP problem. We may not modify other process' flags! */static inline void freeze(struct task_struct *p){ p->flags |= PF_FREEZE;}/* * Wake up a frozen process */static inline int thaw_process(struct task_struct *p){ if (frozen(p)) { p->flags &= ~PF_FROZEN; wake_up_process(p); return 1; } return 0;}/* * freezing is complete, mark process as frozen */static inline void frozen_process(struct task_struct *p){ p->flags = (p->flags & ~PF_FREEZE) | PF_FROZEN;}extern void refrigerator(void);extern int freeze_processes(void);extern void thaw_processes(void);static inline int try_to_freeze(void){ if (freezing(current)) { refrigerator(); return 1; } else return 0;}#elsestatic inline int frozen(struct task_struct *p) { return 0; }static inline int freezing(struct task_struct *p) { return 0; }static inline void freeze(struct task_struct *p) { BUG(); }static inline int thaw_process(struct task_struct *p) { return 1; }static inline void frozen_process(struct task_struct *p) { BUG(); }static inline void refrigerator(void) {}static inline int freeze_processes(void) { BUG(); return 0; }static inline void thaw_processes(void) {}static inline int try_to_freeze(void) { return 0; }#endif /* CONFIG_PM */#endif /* __KERNEL__ */#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?