Skip to content

Instantly share code, notes, and snippets.

@losophy
losophy / skynet_monitor.c
Last active July 25, 2021 09:48
skynet monitor
#include "skynet.h"
#include "skynet_monitor.h"
#include "skynet_server.h"
#include "skynet.h"
#include "atomic.h"
#include <stdlib.h>
#include <string.h>
@losophy
losophy / rwlock.h
Last active July 24, 2021 10:56
skynet中的读写锁
#ifndef SKYNET_RWLOCK_H
#define SKYNET_RWLOCK_H
#ifndef USE_PTHREAD_LOCK
struct rwlock {
int write;// 值为 1 则说明写被锁了
int read; // 读锁的引用计数,不为 0 则说明有别人锁了读
};
@losophy
losophy / spinlock.h
Last active July 23, 2021 04:29
skynet中的自旋锁
#ifndef SKYNET_SPINLOCK_H
#define SKYNET_SPINLOCK_H
#define SPIN_INIT(q) spinlock_init(&(q)->lock);
#define SPIN_LOCK(q) spinlock_lock(&(q)->lock);
#define SPIN_UNLOCK(q) spinlock_unlock(&(q)->lock);
#define SPIN_DESTROY(q) spinlock_destroy(&(q)->lock);
#ifndef USE_PTHREAD_LOCK
//用到了gcc自带的原子操作函数实现了spinlock
struct socket_server *
socket_server_create(uint64_t time) {
int i;
int fd[2];
poll_fd efd = sp_create();
if (sp_invalid(efd)) {
skynet_error(NULL, "socket-server: create event pool failed.");
return NULL;
}
if (pipe(fd)) {//建立管道
#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))
const lu_byte luaP_opmodes[NUM_OPCODES] = {
/* T A B C mode opcode */
opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */
,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */
,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */
,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LOADNIL */
,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */
,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_GETGLOBAL */
@losophy
losophy / skynet_timer.c
Last active June 10, 2021 06:54
skynet-1.4.0 timer实现代码
static void *
thread_timer(void *p) {
struct monitor * m = p;
skynet_initthread(THREAD_TIMER);
for (;;) {
skynet_updatetime();
skynet_socket_updatetime();
CHECK_ABORT
wakeup(m,m->count-1); // 贪婪唤醒工作线程
usleep(2500); // 睡眠 2.5 ms
static Table *getcurrenv (lua_State *L) {
if (L->ci == L->base_ci) /* no enclosing function? *///如果该函数不是内嵌函数,那么直接返回G表
return hvalue(gt(L)); /* use global table as environment */
else {//再则,如果是内嵌函数,就返回其母函数的`env`表
Closure *func = curr_func(L);
return func->c.env;
}
}
LUALIB_API int luaL_ref (lua_State *L, int t) {
@losophy
losophy / lstate.c
Last active May 29, 2021 01:46
lua-5.1.1中的lua_State的实现
static void stack_init (lua_State *L1, lua_State *L) {
/* initialize CallInfo array */
L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo);
L1->ci = L1->base_ci;
L1->size_ci = BASIC_CI_SIZE;
L1->end_ci = L1->base_ci + L1->size_ci - 1;
/* initialize stack array */
L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue);
L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK;
L1->top = L1->stack;
@losophy
losophy / lthread.c
Last active August 5, 2021 01:45
lua-5.1.1中的协程的实现
LUA_API lua_State *lua_newthread (lua_State *L) {
lua_State *L1;
lua_lock(L);
luaC_checkGC(L);
L1 = luaE_newthread(L);
setthvalue(L, L->top, L1);
api_incr_top(L);
lua_unlock(L);
luai_userstatethread(L, L1);
return L1;
@losophy
losophy / ltypes.h
Last active May 28, 2021 13:53
lua-5.1.1中的动态类型的实现
/*
** basic types
*/
#define LUA_TNONE (-1)
#define LUA_TNIL 0
#define LUA_TBOOLEAN 1
#define LUA_TLIGHTUSERDATA 2 //void *
#define LUA_TNUMBER 3 //lua3后采用double精度表示数字整型
#define LUA_TSTRING 4 //TString