epmd源码学习

注: 此处节点是指分布式中分布在各终端的点, 而结点是指存在数据结构中的元素.

各结点组成一个链表

c 代码
 
  1. typedef struct {  
  2.   Node *reg;            /*已注册的结点链表*/  
  3.   Node *unreg;          /*注销的结点链表*/  
  4.   Node *unreg_tail;     /*注销链表尾*/  
  5.   int unreg_count;      /*注销结点个数*/  
  6. } Nodes;  

节点注册过程

1. 先看看注销链表中有没有些结点已经用过, 如果有则复用此结点,但结点的creation要改变, 范围从1到3.
cpp 代码
 
  1. for (node = g->nodes.unreg; node; prev = node, node = node->next)  
  2.     if (strcmp(node->symname, name) == 0)  
  3.     {  
  4.         dbg_tty_printf(g,1,"reusing slot with same name '%s'", node->symname);  
  5.   
  6.         if (prev == NULL)   /* 链表第一个结点就匹配 */  
  7.         {  
  8.             if (node->next == NULL) /* 链表只有一个元素 */  
  9.                 g->nodes.unreg = g->nodes.unreg_tail = NULL;  
  10.             else  
  11.                 g->nodes.unreg = node->next;  
  12.         }  
  13.         else  
  14.         {  
  15.             if (node->next == NULL) /*  链表的最后元素匹配 */  
  16.             {  
  17.                 g->nodes.unreg_tail = prev; /* Point to new last */  
  18.                 prev->next = NULL; /* New last has no next */  
  19.             }  
  20.             else  
  21.                 prev->next = node->next; /* 从链表去除 */  
  22.         }  
  23.   
  24.         g->nodes.unreg_count--; /* 注销结点个数减一 */  
  25.   
  26.         /* 当复用时,我们改变结点的creation值1..3 */ 
  27.         node->creation = node->creation % 3 + 1;  
  28.   
  29.         break;  
  30.     }  


2. 如果没有,看看注销结点链表是否过长.
    如果过长则使用最老的那个注销结点
    否则新建一个结点

cpp 代码
 
  1. if (node == NULL)  
  2. {  
  3.     /* A new name. If the "unreg" list is too long we steal the 
  4.     oldest node structure and use it for the new node, else 
  5.     we allocate a new node structure */  
  6.   
  7.     if ((g->nodes.unreg_count > MAX_UNREG_COUNT) ||  
  8.     (g->debug && (g->nodes.unreg_count > DEBUG_MAX_UNREG_COUNT)))  
  9.     {  
  10.         /* MAX_UNREG_COUNT > 1 so no need to check unreg_tail */  
  11.         node = g->nodes.unreg;  /* Take first == oldest */  
  12.         g->nodes.unreg = node->next; /* Link out */  
  13.         g->nodes.unreg_count--;  
  14.     }  
  15.     else  
  16.     {  
  17.         if ((node = (Node *)malloc(sizeof(Node))) == NULL)  
  18.         {  
  19.             dbg_printf(g,0,"empd: Insufficient memory");  
  20.             exit(1);  
  21.         }  
  22.   
  23.         node->creation = (current_time(g) % 3) + 1; /* "random" 1-3 */  
  24.     }  
  25. }  

你可能感兴趣的:(数据结构,C++,c,C#)