Blame view

include/linux/pid.h 1.41 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  #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 */