Skip to content

Commit

Permalink
为 skynet 阅读做笔记: https://www.zybuluo.com/Nibnat/note/1081922
Browse files Browse the repository at this point in the history
  • Loading branch information
tanbin committed Mar 21, 2018
1 parent e46501d commit b744c14
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 16 deletions.
3 changes: 3 additions & 0 deletions src_code/skynet.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#ifndef SKYNET_H
#define SKYNET_H

/*
对第三方提供的接口,让第三方可以编写自己的服务
*/
#include <stddef.h>

struct skynet_context;
Expand Down
2 changes: 1 addition & 1 deletion src_code/skynet_handle.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ struct handle_storage {
// 下标通过 handle 计算得来:(handle & (s->slot_size-1))
struct skynet_context ** slot;

// 每个服务都可以设置一个名字(但不是必须),名字与服务是通过handle来关联的
// 每个服务都可以设置一个名字(但不是必须),名字与服务是通过 handle 来关联的
int name_cap; // 能容纳的 handle_name 数目,由于 handle_name 和 hadle 不是必须的一一对应,所以开始的时候这个值比较小
int name_count; // 已有的 handle_name 个数
/*
Expand Down
4 changes: 2 additions & 2 deletions src_code/skynet_handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ struct skynet_context;
int skynet_handle_register(struct skynet_context *);
//注销服务,并尝试(如果 ctx 的引用计数为0)释放对应 ctx 的资源
void skynet_handle_retire(int handle);
//从handle_storage中获取此handle对应的ctx,并将引用计数加1
//从 handle_storage 中获取此 handle 对应的 ctx ,并将引用计数加1
struct skynet_context * skynet_handle_grab(int handle);

//通过名字获取对应的handle,-1表示没有
//通过名字获取对应的 handle ,-1表示没有
int skynet_handle_findname(const char * name);
//为 handle 定义名字,返回 name 表示成功,返回 NULL 表示插入失败(名字已存在)
const char * skynet_handle_namehandle(int handle, const char *name);
Expand Down
10 changes: 7 additions & 3 deletions src_code/skynet_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#define MAX_MODULE_TYPE 32
#define SO ".so"

// 用来管理skynet_module
// 用来管理 skynet_module
struct modules {
int count; // 当前已经存在的so库个数
int lock; // 锁,防止同时添加 skynet_module
Expand All @@ -23,6 +23,7 @@ static struct modules * M = NULL;
// 从默认的动态链接库目录找到并打开 name 所指定的so库并返回动态链接库句柄,失败返回NULL
static void *
_try_open(struct modules *m, const char * name) {
// 构造完成so库路径
size_t path_size = strlen(m->path);
size_t name_size = strlen(name);
char tmp[path_size + name_size + sizeof(SO)];
Expand Down Expand Up @@ -109,7 +110,7 @@ skynet_module_insert(struct skynet_module *mod) {
struct skynet_module * m = _query(mod->name);
assert(m == NULL && M->count < MAX_MODULE_TYPE);
int index = M->count;
M->m[index] = *mod;
M->m[index] = *mod; // QUESTION: 这里指针进行浅复制,会有问题
++M->count;
__sync_lock_release(&M->lock);
}
Expand All @@ -124,7 +125,10 @@ skynet_module_instance_create(struct skynet_module *m) {
}
}

// init 接口实现中需要设置好回调接口
/*
1. init 接口实现中需要设置好回调接口,之后处理消息的时候需要调用
2. 返回0表示成功
*/
int
skynet_module_instance_init(struct skynet_module *m, void * inst, struct skynet_context *ctx, const char * parm) {
return m->init(inst, ctx, parm);
Expand Down
9 changes: 6 additions & 3 deletions src_code/skynet_module.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ typedef void (*skynet_dl_release)(void * inst);
struct skynet_module {
const char * name; // so库名
void * module; // 动态链接库句柄
skynet_dl_create create; // 调用创建函数,返回实例指针,之后作为 init 函数的参数传入
skynet_dl_create create; // 创建函数。返回实例指针,之后作为 init 函数的参数传入
skynet_dl_init init; // 返回 0 为成功
skynet_dl_release release;
};
Expand All @@ -30,10 +30,13 @@ struct skynet_module * skynet_module_query(const char * name);
*/
void * skynet_module_instance_create(struct skynet_module *);
/*
init 接口实现中需要设置好回调接口
返回0表示成功
1. init 接口实现中需要设置好回调接口,之后处理消息的时候需要调用
2. 返回0表示成功
*/
int skynet_module_instance_init(struct skynet_module *, void * inst, struct skynet_context *ctx, const char * parm);
/*
清理释放
*/
void skynet_module_instance_release(struct skynet_module *, void *inst);

/*
Expand Down
8 changes: 4 additions & 4 deletions src_code/skynet_mq.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

struct message_queue {
int cap; // 消息队列能容纳的消息数
int head; // 指向当前可以取出消息的位置,由取出操作对应的函数来管理
int tail; // 指向当前可以插入的队列中的位置,由插入操作对应的函数来管理
int lock; // 自旋锁
int head; // 指向当前可以取出消息的位置,由取出操作 skynet_mq_leave 来管理
int tail; // 指向当前可以插入的队列中的位置,由插入操作 skynet_mq_enter 来管理
int lock; // 自旋锁,确保添加消息和取出消息不出错
struct skynet_message *queue;
};

Expand Down Expand Up @@ -64,7 +64,7 @@ skynet_mq_leave(struct message_queue *q, struct skynet_message *message) {
return ret;
}

// 将新消息添加到指定队列尾
// 将新消息添加到指定队列尾,队列如果满了则扩大一倍
void
skynet_mq_enter(struct message_queue *q, struct skynet_message *message) {
_lock_queue(q);
Expand Down
2 changes: 1 addition & 1 deletion src_code/skynet_mq.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ struct message_queue * skynet_mq_create(int cap);
void skynet_mq_release(struct message_queue *q);
// 从指定消息队列头中取出一个消息,返回此消息的目的地,返回 -1 表示阻塞( 也就是没消息 )
int skynet_mq_leave(struct message_queue *q, struct skynet_message *message);
// 将指定新消息添加到队列尾
// 将新消息添加到指定队列尾,队列如果满了则扩大一倍
void skynet_mq_enter(struct message_queue *q, struct skynet_message *message);

// skynet_mq_create 的语法糖,创建消息队列 Q
Expand Down
4 changes: 2 additions & 2 deletions src_code/skynet_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@

struct skynet_context {
void * instance; // 实例指针,通过调用创建实例函数返回
struct skynet_module * mod;
struct skynet_module * mod; // 实例对应的模块
int handle; // 服务编号
/*
calling 是一种标识,为 1 表示触发,为 0 表示没有触发
当前的作用是,因为 init 接口中可能会给自己发消息,而消息的响应是需要调用回调函数,而回调函数的设置是在 init 接口中
所以在这里设置一个标识,表示是否准备好。后面的消息分发代码中会查询这个设置,如果为 1 则将消息推送到消息队列,否则直接分发
所以在这里设置一个标识,表示是否准备好。后面的消息分发代码中会查询这个设置,如果为 1 则将消息推送到消息队列,否则直接调用回调函数处理
*/
int calling;
int ref; // 引用计数
Expand Down

0 comments on commit b744c14

Please sign in to comment.