535
536 static inline void hash_pid(struct task_struct *p)
537 {
538 struct task_struct **htable = &pidhash[pid_hashfn(p->pid)];
调用pid_hashfn将p散列到数组pidhash[]中,返回散列数组相应元素的地址,保存在htable中
539
540 if((p->pidhash_next = *htable) != NULL)
将p的pidhash_next赋值为上面散列函数返回的散列数组中的相应元素;如果这个元素不为NULL,表示该位置有散列冲突。
541 (*htable)->pidhash_pprev = &p->pidhash_next;
冲突,将新散列任务的结构p中的pidhash_next的地址保存在冲突元素的pidhash_pprev中
542 *htable = p;
将新的任务结构放在散列数组中。
543 p->pidhash_pprev = htable;
将p散列得到的散列数组元素的地址保存在p的pidhash_pprev中。
544 }
这样新散列元素的pidhash_next总是指向冲突元素(如果存在的话),冲突元素的pidhash_pprev指向新元素的pidhash_next域,新元素的pidhash_pprev总指向该结构在散列数组中相应元素的地址。
要访问任务结构也是将pid作为seed调用pid_hashfn,这样可以通过检查散列数组相应元素所指向的结构的pidhash_next是否为空来判断是否有冲突。如果有冲突,就可有根据pidhash_next来遍历这个链表找到需要的任务结构.
536 static inline void hash_pid(struct task_struct *p)
537 {
538 struct task_struct **htable = &pidhash[pid_hashfn(p->pid)];
调用pid_hashfn将p散列到数组pidhash[]中,返回散列数组相应元素的地址,保存在htable中
539
540 if((p->pidhash_next = *htable) != NULL)
将p的pidhash_next赋值为上面散列函数返回的散列数组中的相应元素;如果这个元素不为NULL,表示该位置有散列冲突。
541 (*htable)->pidhash_pprev = &p->pidhash_next;
冲突,将新散列任务的结构p中的pidhash_next的地址保存在冲突元素的pidhash_pprev中
542 *htable = p;
将新的任务结构放在散列数组中。
543 p->pidhash_pprev = htable;
将p散列得到的散列数组元素的地址保存在p的pidhash_pprev中。
544 }
这样新散列元素的pidhash_next总是指向冲突元素(如果存在的话),冲突元素的pidhash_pprev指向新元素的pidhash_next域,新元素的pidhash_pprev总指向该结构在散列数组中相应元素的地址。
要访问任务结构也是将pid作为seed调用pid_hashfn,这样可以通过检查散列数组相应元素所指向的结构的pidhash_next是否为空来判断是否有冲突。如果有冲突,就可有根据pidhash_next来遍历这个链表找到需要的任务结构.