#define _TAG_IMMED1_PID ((0x0 << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_IMMED1)
#define _TAG_PRIMARY_SIZE 2 #define TAG_PRIMARY_IMMED1 0x3
由上面得到_TAG_IMMED1_PID=0x3(0000 0000 0000 0000 0000 0000 0000 0011)
而判断是否是内部pid的定义是:
#define is_internal_pid(x) (((x) & _TAG_IMMED1_MASK) == _TAG_IMMED1_PID)
而
(x) & _TAG_IMMED1_MASK
是将pid的前28位置零,即:
将
引用
nnnn nnnn nnnn nnnn nnnn nnnn nnnn xxxx
变成
引用
0000 0000 0000 0000 0000 0000 0000 xxxx
最后比较两边是否相等,即xxxx=0011。
总结:
宏is_internal_pid通过判断pid的后4位是不是0011,如果是的话,就是内部pid,否则不是。
在erts/emulator/beam/erl_term.h文件里,有如下的pid格式定义:
引用
/*
* PID layout (internal pids):
*
* |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | |
* |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0|
* | | | | |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |n n n n n n n n n n n n n n n n n n n n n n n n n n n n| 0 0|1 1|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* n : number
*
* Old pid layout:
*
* |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | |
* |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0|
* | | | | |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |s s s|n n n n n n n n n n n n n n n|N N N N N N N N|c c|0 0|1 1|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* s : serial
* n : number
* c : creation
* N : node number
*
*/
pid为3683,二进制表示为
0000 0000 0000 0000 0000 1110 0110 0011,
去掉tag(即后四位),则为
0000 0000 0000 0000 0000 1110 0110,
换算成十进制则为230,则外部表示则为<0.230.0>;