<span style="white-space:pre"> </span>ctx->handle = skynet_handle_register(ctx); // 注册得到一个服务句柄 struct message_queue * queue = ctx->queue = skynet_mq_create(ctx->handle); // init function maybe use ctx->handle, so it must init at last context_inc(); // 这个skynet节点服务数加1 CHECKCALLING_BEGIN(ctx) int r = skynet_module_instance_init(mod, inst, ctx, param); CHECKCALLING_END(ctx) if (r == 0) { // xxx_init 成功返回,刚才的 ref-1 = 1 struct skynet_context * ret = skynet_context_release(ctx); if (ret) { ctx->init = true; // 初始化成功 } // 放入全局消息队列,可以接受其他服务的消息 skynet_globalmq_push(queue); if (ret) { skynet_error(ret, "LAUNCH %s %s", name, param ? param : ""); } return ret; } else { skynet_error(ctx, "FAILED launch %s", name); uint32_t handle = ctx->handle; skynet_context_release(ctx); skynet_handle_retire(handle); struct drop_t d = { handle }; skynet_mq_release(queue, drop_message, &d); return NULL; }
struct skynet_message smsg; if (context == NULL) { smsg.source = 0; } else { // msg source 是ctx的handle号 smsg.source = skynet_context_handle(context); } smsg.session = 0; smsg.data = data; // sz低24位保存的是数据大小 smsg.sz = len | (PTYPE_TEXT << HANDLE_REMOTE_SHIFT); // 把这个消息放到logger的队列中 skynet_context_push(logger, &smsg);
static void _dispatch_message(struct skynet_context *ctx, struct skynet_message *msg) { assert(ctx->init); CHECKCALLING_BEGIN(ctx) pthread_setspecific(G_NODE.handle_key, (void *)(uintptr_t)(ctx->handle)); int type = msg->sz >> HANDLE_REMOTE_SHIFT; size_t sz = msg->sz & HANDLE_MASK; // 执行节点的回调接口_cb if (!ctx->cb(ctx, ctx->cb_ud, type, msg->session, msg->source, msg->data, sz)) { skynet_free(msg->data); } CHECKCALLING_END(ctx) }
原文地址:http://blog.csdn.net/vonzhoufz/article/details/38877337