| #ifndef _LINUX_PID_H | 
 | #define _LINUX_PID_H | 
 |  | 
 | enum pid_type | 
 | { | 
 | 	PIDTYPE_PID, | 
 | 	PIDTYPE_TGID, | 
 | 	PIDTYPE_PGID, | 
 | 	PIDTYPE_SID, | 
 | 	PIDTYPE_MAX | 
 | }; | 
 |  | 
 | struct pid | 
 | { | 
 | 	/* Try to keep pid_chain in the same cacheline as nr for find_pid */ | 
 | 	int nr; | 
 | 	struct hlist_node pid_chain; | 
 | 	/* list of pids with the same nr, only one of them is in the hash */ | 
 | 	struct list_head pid_list; | 
 | }; | 
 |  | 
 | #define pid_task(elem, type) \ | 
 | 	list_entry(elem, struct task_struct, pids[type].pid_list) | 
 |  | 
 | /* | 
 |  * attach_pid() and detach_pid() must be called with the tasklist_lock | 
 |  * write-held. | 
 |  */ | 
 | extern int FASTCALL(attach_pid(struct task_struct *task, enum pid_type type, int nr)); | 
 |  | 
 | extern void FASTCALL(detach_pid(struct task_struct *task, enum pid_type)); | 
 |  | 
 | /* | 
 |  * look up a PID in the hash table. Must be called with the tasklist_lock | 
 |  * held. | 
 |  */ | 
 | extern struct pid *FASTCALL(find_pid(enum pid_type, int)); | 
 |  | 
 | extern int alloc_pidmap(void); | 
 | extern void FASTCALL(free_pidmap(int)); | 
 | extern void switch_exec_pids(struct task_struct *leader, struct task_struct *thread); | 
 |  | 
 | #define do_each_task_pid(who, type, task)				\ | 
 | 	if ((task = find_task_by_pid_type(type, who))) {		\ | 
 | 		prefetch((task)->pids[type].pid_list.next);		\ | 
 | 		do { | 
 |  | 
 | #define while_each_task_pid(who, type, task)				\ | 
 | 		} while (task = pid_task((task)->pids[type].pid_list.next,\ | 
 | 						type),			\ | 
 | 			prefetch((task)->pids[type].pid_list.next),	\ | 
 | 			hlist_unhashed(&(task)->pids[type].pid_chain));	\ | 
 | 	}								\ | 
 |  | 
 | #endif /* _LINUX_PID_H */ |