注: 此处节点是指分布式中分布在各终端的点, 而结点是指存在数据结构中的元素.
各结点组成一个链表
节点注册过程
1. 先看看注销链表中有没有些结点已经用过, 如果有则复用此结点,但结点的creation要改变, 范围从1到3.
2. 如果没有,看看注销结点链表是否过长.
如果过长则使用最老的那个注销结点
否则新建一个结点
各结点组成一个链表
c 代码
- typedef struct {
- Node *reg; /*已注册的结点链表*/
- Node *unreg; /*注销的结点链表*/
- Node *unreg_tail; /*注销链表尾*/
- int unreg_count; /*注销结点个数*/
- } Nodes;
节点注册过程
1. 先看看注销链表中有没有些结点已经用过, 如果有则复用此结点,但结点的creation要改变, 范围从1到3.
cpp 代码
- for (node = g->nodes.unreg; node; prev = node, node = node->next)
- if (strcmp(node->symname, name) == 0)
- {
- dbg_tty_printf(g,1,"reusing slot with same name '%s'", node->symname);
- if (prev == NULL) /* 链表第一个结点就匹配 */
- {
- if (node->next == NULL) /* 链表只有一个元素 */
- g->nodes.unreg = g->nodes.unreg_tail = NULL;
- else
- g->nodes.unreg = node->next;
- }
- else
- {
- if (node->next == NULL) /* 链表的最后元素匹配 */
- {
- g->nodes.unreg_tail = prev; /* Point to new last */
- prev->next = NULL; /* New last has no next */
- }
- else
- prev->next = node->next; /* 从链表去除 */
- }
- g->nodes.unreg_count--; /* 注销结点个数减一 */
- /* 当复用时,我们改变结点的creation值1..3 */
- node->creation = node->creation % 3 + 1;
- break;
- }
2. 如果没有,看看注销结点链表是否过长.
如果过长则使用最老的那个注销结点
否则新建一个结点
cpp 代码
- if (node == NULL)
- {
- /* A new name. If the "unreg" list is too long we steal the
- oldest node structure and use it for the new node, else
- we allocate a new node structure */
- if ((g->nodes.unreg_count > MAX_UNREG_COUNT) ||
- (g->debug && (g->nodes.unreg_count > DEBUG_MAX_UNREG_COUNT)))
- {
- /* MAX_UNREG_COUNT > 1 so no need to check unreg_tail */
- node = g->nodes.unreg; /* Take first == oldest */
- g->nodes.unreg = node->next; /* Link out */
- g->nodes.unreg_count--;
- }
- else
- {
- if ((node = (Node *)malloc(sizeof(Node))) == NULL)
- {
- dbg_printf(g,0,"empd: Insufficient memory");
- exit(1);
- }
- node->creation = (current_time(g) % 3) + 1; /* "random" 1-3 */
- }
- }