skynet源码阅读<3>--网关分析】的更多相关文章

继上一篇介绍了skynet的网络部分之后,这一篇以网关gate.lua为例,简单分析下其串接和处理流程. 在官方给出的范例中,是以examples/main.lua作为启动脚本的,在此过程中会创建watchdog服务: local watchdog = skynet.newservice("watchdog") skynet.call(watchdog, "lua", "start", { port = , maxclient = max_cli…
阅读skynet的lua-c交互部分代码时,可以看到如下处理: struct skynet_context * context = lua_touserdata(L, lua_upvalueindex(1)); 那么,问题来了:skynet_context是如何作为upvalue与C函数绑定在一起的呢?这里以luaopen_skynet_core(lua_State *L)为例: int luaopen_skynet_core(lua_State *L) { luaL_checkversion(…
注:为方便理解,本文贴出的代码部分经过了缩减或展开,与实际skynet代码可能会有所出入.    作为一个skynet actor,在启动脚本被加载的过程中,总是要调用skynet.start和skynet.dispatch的,前者在skynet-os中做一些初始化工作,设置消息的Lua回调,后者则注册针对某协议的解析回调.举个例子: local skynet = require "skynet" local function hello() skynet.ret(skynet.pac…
相比于上节我们提到的协程调度,skynet的线程调度从逻辑流程上来看要简单很多.下面我们就来具体做一分析.首先自然是以skynet_start.c为入口: static void start(int thread) { pthread_t pid[thread+]; struct monitor *m = skynet_malloc(sizeof(*m)); memset(m, , sizeof(*m)); m->count = thread; m->sleep = ; m->m = s…
昨天和三石公聊天,他提到timer的实现原理,我当时迟疑了一下,心想timer不是系统底层时钟中断驱动上层进程/线程,累积计时实现的么?他简述了timer的实现,什么堆排序,优先级队列等,与我想象的不同.正好这两天在作skynet笔记,以前也没有留意过skynet的timer,这次干脆就看看它是怎么实现的.看了之后我明白了,我与三石公所设想的不是同一个问题.他所关心的问题其实是:框架被注册多个定时回调,如何管理并尽可能高效地触发这些回调.这里我们假设框架将定时消息抽象为timer_node,框架…
最近几周粗略看了 skynet 代码的 C 部分.遇到很多知识点以前只是知道,但并不十分了解,所以这是一个学习的过程. 从 main 函数开始,闷头一阵看下来,着实蛋疼. 当看了 skynet_mq.c 和 skynet_module.c 之后才终于有了头绪. C 代码通篇下来并没有什么特别的难点.看 Lua 代码的时候,我的头开始大了,我了个擦擦擦,神乎其技啊. 一开始读 Lua 代码时,C 层的东西我也才刚读完,还没有消化好,所以读起来很吃力. 于是,停下来不再继续看代码,而是去云风的博客上…
在使用skynet开发时,你也许会碰到类似这样的警告:A message from [ :0100000f ] to [ :0100000a ] maybe in an endless loop (version = 137)    它表示你的代码在某处陷入了死循环.但是如何找到死循环的点呢?可以这样做:    1)本机登陆skynet控制台:nc 127.0.0.1 8000 ==> telnet登录skynet    2)输入命令:signal addr 0                …
先来看下socket_server的数据结构,这里简称为ss: struct socket_server { int recvctrl_fd; int sendctrl_fd; int checkctrl; poll_fd event_fd; int alloc_id; int event_n; int event_index; struct socket_object_interface soi; struct event ev[MAX_EVENT]; struct socket slot[M…
概述 在前端开发过程中,我们经常会遇到需要发送异步请求的情况.而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率. axios是一个在近些年来非常火的一个HTTP请求库,目前在GitHub中已经拥有了超过40K的star,受到了各位大佬的推荐. 今天,我们就来看下,axios到底是如何设计的,其中又有哪些值得我们学习的地方.我在写这边文章时,axios的版本为0.18.0.我们就以这个版本的代码为例,来进行具体的源码阅读和分析.当前axios所有…
最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 hashCode 方法 toString 方法 finalize 方法 registerNatives 方法 1. Object结构图 2. 类构造器   类构造器是创建Java对象的方法之一.一般我们都使用new关键字来进行实例,还可以在构造器中进行相应的初始化操作.   在一个Java类中必须存在一个…