每个服务通过一个32位的无符号整数进行标识,整数的高8位用于定位属于哪个节点,低24位用于定位属于哪个服务。本地节点号通过HARBOR进行存储位于文件skynet_harbor.c中,全局的所有服务信息通过H进行存储位于文件skynet_handle.c中。其中涉及到的结构有:
struct handle_name {
char * name; //服务名字
uint32_t handle; //用于定位服务,高8位为节点编号,低24位为服务号
};
//全局服务信息结构体
struct handle_storage {
struct rwlock lock; //读写锁
uint32_t harbor; //定位节点
uint32_t handle_index; //服务的信息下一个存储到slot的第几个
int slot_size; //存储服务信息数组的大小
struct skynet_context ** slot; //存储服务信息数组
int name_cap; //服务名数组的容量
int name_count; //服务名数组当前存的服务名的数量
struct handle_name *name; //服务名及定位服务的handle
};
每个服务的信息存储结构体定义于文件skynet_server.c中,该文件实现了服务的基本逻辑功能,并且在该文件中定义了一个结构体用于记录该节点上全局服务的状态信息,相应的结构体为:
//每个服务的信息存储结构体
struct skynet_context {
void * instance; //动态连接库的实例指针 即服务的实例指针
struct skynet_module * mod; //指定已加载的动态库信息
void * cb_ud; //服务回调的对象
skynet_cb cb; //服务的回调函数
struct message_queue *queue; //服务队列
FILE * logfile; //日志输出的文件
uint64_t cpu_cost; // in microsec //消耗CUP时间 精确到微秒
uint64_t cpu_start; // in microsec //本线程到当前代码