at v2.6.13 1.4 kB view raw
1#ifndef _LINUX_PID_H 2#define _LINUX_PID_H 3 4enum pid_type 5{ 6 PIDTYPE_PID, 7 PIDTYPE_TGID, 8 PIDTYPE_PGID, 9 PIDTYPE_SID, 10 PIDTYPE_MAX 11}; 12 13struct pid 14{ 15 /* Try to keep pid_chain in the same cacheline as nr for find_pid */ 16 int nr; 17 struct hlist_node pid_chain; 18 /* list of pids with the same nr, only one of them is in the hash */ 19 struct list_head pid_list; 20}; 21 22#define pid_task(elem, type) \ 23 list_entry(elem, struct task_struct, pids[type].pid_list) 24 25/* 26 * attach_pid() and detach_pid() must be called with the tasklist_lock 27 * write-held. 28 */ 29extern int FASTCALL(attach_pid(struct task_struct *task, enum pid_type type, int nr)); 30 31extern void FASTCALL(detach_pid(struct task_struct *task, enum pid_type)); 32 33/* 34 * look up a PID in the hash table. Must be called with the tasklist_lock 35 * held. 36 */ 37extern struct pid *FASTCALL(find_pid(enum pid_type, int)); 38 39extern int alloc_pidmap(void); 40extern void FASTCALL(free_pidmap(int)); 41extern void switch_exec_pids(struct task_struct *leader, struct task_struct *thread); 42 43#define do_each_task_pid(who, type, task) \ 44 if ((task = find_task_by_pid_type(type, who))) { \ 45 prefetch((task)->pids[type].pid_list.next); \ 46 do { 47 48#define while_each_task_pid(who, type, task) \ 49 } while (task = pid_task((task)->pids[type].pid_list.next,\ 50 type), \ 51 prefetch((task)->pids[type].pid_list.next), \ 52 hlist_unhashed(&(task)->pids[type].pid_chain)); \ 53 } \ 54 55#endif /* _LINUX_PID_H */