返回顶部
首页 > 资讯 > 后端开发 > Python >skynet---3---看看
  • 593
分享到

skynet---3---看看

skynet 2023-01-31 07:01:21 593人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

#ifndef SKYNET_HARBOR_H #define SKYNET_HARBOR_H #include <stdint.h> #include <stdlib.h> #define GLOBALNAME_L

#ifndef SKYNET_HARBOR_H
#define SKYNET_HARBOR_H
#include <stdint.h>
#include <stdlib.h>
#define GLOBALNAME_LENGTH 16
#define REMOTE_MAX 256
// reserve high 8 bits for remote id
#define HANDLE_MASK 0xffffff
#define HANDLE_REMOTE_SHIFT 24
struct remote_name {
    char name[GLOBALNAME_LENGTH];
    uint32_t handle;
};
struct remote_message {
    struct remote_name destination;
    const void * message;
    size_t sz;
};
void skynet_harbor_send(struct remote_message *rmsg, uint32_t source, int session);
void skynet_harbor_reGISter(struct remote_name *rname);
int skynet_harbor_message_isremote(uint32_t handle);
void skynet_harbor_init(int harbor);
int skynet_harbor_start(const char * master, const char *local);
#endif


harbor----港口。。。干嘛的。。。待解。。


#include "skynet.h"
#include "skynet_harbor.h"
#include "skynet_server.h"
#include <string.h>
#include <stdio.h>
#include <assert.h>
static struct skynet_context * REMOTE = 0;
static unsigned int HARBOR = 0;
void
skynet_harbor_send(struct remote_message *rmsg, uint32_t source, int session) {
    int type = rmsg->sz >> HANDLE_REMOTE_SHIFT;
    rmsg->sz &= HANDLE_MASK;
    assert(type != PTYPE_SYSTEM && type != PTYPE_HARBOR);
    skynet_context_send(REMOTE, rmsg, sizeof(*rmsg) , source, type , session);
}
void
skynet_harbor_register(struct remote_name *rname) {
    int i;
    int number = 1;
    for (i=0;i<GLOBALNAME_LENGTH;i++) {
        char c = rname->name[i];
        if (!(c >= '0' && c <='9')) {
            number = 0;
            break;
        }
    }
    assert(number == 0);
    skynet_context_send(REMOTE, rname, sizeof(*rname), 0, PTYPE_SYSTEM , 0);
}
int
skynet_harbor_message_isremote(uint32_t handle) {
    int h = (handle & ~HANDLE_MASK);
    return h != HARBOR && h !=0;
}
void
skynet_harbor_init(int harbor) {
    HARBOR = (unsigned int)harbor << HANDLE_REMOTE_SHIFT;
}
int
skynet_harbor_start(const char * master, const char *local) {
    size_t sz = strlen(master) + strlen(local) + 32;
    char args[sz];
    sprintf(args, "%s %s %d",master,local,HARBOR >> HANDLE_REMOTE_SHIFT);
    struct skynet_context * inst = skynet_context_new("harbor",args);
    if (inst == NULL) {
        return 1;
    }
    REMOTE = inst;
    return 0;
}


skynet_context都是用这个结构,来交互。。


#ifndef SKYNET_CONTEXT_HANDLE_H
#define SKYNET_CONTEXT_HANDLE_H
#include <stdint.h>
#include "skynet_harbor.h"
struct skynet_context;
uint32_t skynet_handle_register(struct skynet_context *);
void skynet_handle_retire(uint32_t handle);
struct skynet_context * skynet_handle_grab(uint32_t handle);
void skynet_handle_retireall();
uint32_t skynet_handle_findname(const char * name);
const char * skynet_handle_namehandle(uint32_t handle, const char *name);
void skynet_handle_init(int harbor);
#endif


哎。。要是有个说明多好。。。刚开始不入门看着真空虚啊。


#include "skynet_handle.h"
#include "skynet_server.h"
#include "rwlock.h"
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define DEFAULT_SLOT_SIZE 4
struct handle_name {
    char * name;
    uint32_t handle;
};
struct handle_storage {
    struct rwlock lock;
    uint32_t harbor;
    uint32_t handle_index;
    int slot_size;
    struct skynet_context ** slot;
                                                   
    int name_cap;
    int name_count;
    struct handle_name *name;
};
static struct handle_storage *H = NULL;
uint32_t
skynet_handle_register(struct skynet_context *ctx) {
    struct handle_storage *s = H;
    rwlock_wlock(&s->lock);
                                                   
    for (;;) {
        int i;
        for (i=0;i<s->slot_size;i++) {
            uint32_t handle = (i+s->handle_index) & HANDLE_MASK;
            int hash = handle & (s->slot_size-1);
            if (s->slot[hash] == NULL) {
                s->slot[hash] = ctx;
                s->handle_index = handle + 1;
                rwlock_wunlock(&s->lock);
                handle |= s->harbor;
                skynet_context_init(ctx, handle);
                return handle;
            }
        }
        assert((s->slot_size*2 - 1) <= HANDLE_MASK);
        struct skynet_context ** new_slot = malloc(s->slot_size * 2 * sizeof(struct skynet_context *));
        memset(new_slot, 0, s->slot_size * 2 * sizeof(struct skynet_context *));
        for (i=0;i<s->slot_size;i++) {
            int hash = skynet_context_handle(s->slot[i]) & (s->slot_size * 2 - 1);
            assert(new_slot[hash] == NULL);
            new_slot[hash] = s->slot[i];
        }
        free(s->slot);
        s->slot = new_slot;
        s->slot_size *= 2;
    }
}
void
skynet_handle_retire(uint32_t handle) {
    struct handle_storage *s = H;
    rwlock_wlock(&s->lock);
    uint32_t hash = handle & (s->slot_size-1);
    struct skynet_context * ctx = s->slot[hash];
    if (ctx != NULL && skynet_context_handle(ctx) == handle) {
        skynet_context_release(ctx);
        s->slot[hash] = NULL;
        int i;
        int j=0, n=s->name_count;
        for (i=0; i<n; ++i) {
            if (s->name[i].handle == handle) {
                free(s->name[i].name);
                continue;
            } else if (i!=j) {
                s->name[j] = s->name[i];
            }
            ++j;
        }
        s->name_count = j;
    }
    rwlock_wunlock(&s->lock);
}
void
skynet_handle_retireall() {
    struct handle_storage *s = H;
    for (;;) {
        int n=0;
        int i;
        for (i=0;i<s->slot_size;i++) {
            rwlock_rlock(&s->lock);
            struct skynet_context * ctx = s->slot[i];
            rwlock_runlock(&s->lock);
            if (ctx != NULL) {
                ++n;
                skynet_handle_retire(skynet_context_handle(ctx));
            }
        }
        if (n==0)
            return;
    }
}
struct skynet_context *
skynet_handle_grab(uint32_t handle) {
    struct handle_storage *s = H;
    struct skynet_context * result = NULL;
    rwlock_rlock(&s->lock);
    uint32_t hash = handle & (s->slot_size-1);
    struct skynet_context * ctx = s->slot[hash];
    if (ctx && skynet_context_handle(ctx) == handle) {
        result = ctx;
        skynet_context_grab(result);
    }
    rwlock_runlock(&s->lock);
    return result;
}
uint32_t
skynet_handle_findname(const char * name) {
    struct handle_storage *s = H;
    rwlock_rlock(&s->lock);
    uint32_t handle = 0;
    int begin = 0;
    int end = s->name_count - 1;
    while (begin<=end) {
        int mid = (begin+end)/2;
        struct handle_name *n = &s->name[mid];
        int c = strcmp(n->name, name);
        if (c==0) {
            handle = n->handle;
            break;
        }
        if (c<0) {
            begin = mid + 1;
        } else {
            end = mid - 1;
        }
    }
    rwlock_runlock(&s->lock);
    return handle;
}
static void
_insert_name_before(struct handle_storage *s, char *name, uint32_t handle, int before) {
    if (s->name_count >= s->name_cap) {
        s->name_cap *= 2;
        struct handle_name * n = malloc(s->name_cap * sizeof(struct handle_name));
        int i;
        for (i=0;i<before;i++) {
            n[i] = s->name[i];
        }
        for (i=before;i<s->name_count;i++) {
            n[i+1] = s->name[i];
        }
        free(s->name);
        s->name = n;
    } else {
        int i;
        for (i=s->name_count;i>before;i--) {
            s->name[i] = s->name[i-1];
        }
    }
    s->name[before].name = name;
    s->name[before].handle = handle;
    s->name_count ++;
}
static const char *
_insert_name(struct handle_storage *s, const char * name, uint32_t handle) {
    int begin = 0;
    int end = s->name_count - 1;
    while (begin<=end) {
        int mid = (begin+end)/2;
        struct handle_name *n = &s->name[mid];
        int c = strcmp(n->name, name);
        if (c==0) {
            return NULL;
        }
        if (c<0) {
            begin = mid + 1;
        } else {
            end = mid - 1;
        }
    }
    char * result = strdup(name);
    _insert_name_before(s, result, handle, begin);
    return result;
}
const char *
skynet_handle_namehandle(uint32_t handle, const char *name) {
    rwlock_wlock(&H->lock);
    const char * ret = _insert_name(H, name, handle);
    rwlock_wunlock(&H->lock);
    return ret;
}
void
skynet_handle_init(int harbor) {
    assert(H==NULL);
    struct handle_storage * s = malloc(sizeof(*H));
    s->slot_size = DEFAULT_SLOT_SIZE;
    s->slot = malloc(s->slot_size * sizeof(struct skynet_context *));
    memset(s->slot, 0, s->slot_size * sizeof(struct skynet_context *));
    rwlock_init(&s->lock);
    // reserve 0 for system
    s->harbor = (uint32_t) (harbor & 0xff) << HANDLE_REMOTE_SHIFT;
    s->handle_index = 1;
    s->name_cap = 2;
    s->name_count = 0;
    s->name = malloc(s->name_cap * sizeof(struct handle_name));
    H = s;
    // Don't need to free H
}


貌似是把handle,name和context对应起来。。。好吧。我没耐心了。。


#ifndef SKYNET_MODULE_H
#define SKYNET_MODULE_H
struct skynet_context;
typedef void * (*skynet_dl_create)(void);
typedef int (*skynet_dl_init)(void * inst, struct skynet_context *, const char * parm);
typedef void (*skynet_dl_release)(void * inst);
struct skynet_module {
    const char * name;
    void * module;
    skynet_dl_create create;
    skynet_dl_init init;
    skynet_dl_release release;
};
void skynet_module_insert(struct skynet_module *mod);
struct skynet_module * skynet_module_query(const char * name);
void * skynet_module_instance_create(struct skynet_module *);
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);
void skynet_module_init(const char *path);
#endif


这么抽象的东西。。。模块。。。可以自己实现。。。?


#include "skynet_module.h"
#include <assert.h>
#include <string.h>
#include <dlfcn.h>//这个好陌生。。。dll相关函数:dlopen-打开动态链接库
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#define MAX_MODULE_TYPE 32
struct modules {
    int count;
    int lock;
    const char * path;
    struct skynet_module m[MAX_MODULE_TYPE];
};
static struct modules * M = NULL;
static void *
_try_open(struct modules *m, const char * name) {
    const char * path = m->path;
    size_t path_size = strlen(path);
    size_t name_size = strlen(name);
    int sz = path_size + name_size;
    char tmp[sz];
    int i;
    for (i=0;path[i]!='?' && path[i]!='\0';i++) {
        tmp[i] = path[i];
    }
    memcpy(tmp+i,name,name_size);
    if (path[i] == '?') {
        strcpy(tmp+i+name_size,path+i+1);
    } else {
        fprintf(stderr,"Invalid C service path\n");
        exit(1);
    }
    void * dl = dlopen(tmp, RTLD_NOW | RTLD_GLOBAL);
    if (dl == NULL) {
        fprintf(stderr, "try open %s failed : %s\n",tmp,dlerror());
    }
    return dl;
}
static struct skynet_module *
_query(const char * name) {
    int i;
    for (i=0;i<M->count;i++) {
        if (strcmp(M->m[i].name,name)==0) {
            return &M->m[i];
        }
    }
    return NULL;
}
static int
_open_sym(struct skynet_module *mod) {
    size_t name_size = strlen(mod->name);
    char tmp[name_size + 9]; // create/init/release , longest name is release (7)
    memcpy(tmp, mod->name, name_size);
    strcpy(tmp+name_size, "_create");
    mod->create = dlsym(mod->module, tmp);
    strcpy(tmp+name_size, "_init");
    mod->init = dlsym(mod->module, tmp);
    strcpy(tmp+name_size, "_release");
    mod->release = dlsym(mod->module, tmp);
    return mod->init == NULL;
}
struct skynet_module *
skynet_module_query(const char * name) {
    struct skynet_module * result = _query(name);
    if (result)
        return result;
    while(__sync_lock_test_and_set(&M->lock,1)) {}
    result = _query(name); // double check
    if (result == NULL && M->count < MAX_MODULE_TYPE) {
        int index = M->count;
        void * dl = _try_open(M,name);
        if (dl) {
            M->m[index].name = name;
            M->m[index].module = dl;
            if (_open_sym(&M->m[index]) == 0) {
                M->m[index].name = strdup(name);
                M->count ++;
                result = &M->m[index];
            }
        }
    }
    __sync_lock_release(&M->lock);
    return result;
}
void
skynet_module_insert(struct skynet_module *mod) {
    while(__sync_lock_test_and_set(&M->lock,1)) {}
    struct skynet_module * m = _query(mod->name);
    assert(m == NULL && M->count < MAX_MODULE_TYPE);
    int index = M->count;
    M->m[index] = *mod;
    ++M->count;
    __sync_lock_release(&M->lock);
}
void *
skynet_module_instance_create(struct skynet_module *m) {
    if (m->create) {
        return m->create();
    } else {
        return (void *)(intptr_t)(~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);
}
void
skynet_module_instance_release(struct skynet_module *m, void *inst) {
    if (m->release) {
        m->release(inst);
    }
}
void
skynet_module_init(const char *path) {
    struct modules *m = malloc(sizeof(*m));
    m->count = 0;
    m->path = strdup(path);
    m->lock = 0;
    M = m;
}


打开dll,模块。。。

--结束END--

本文标题: skynet---3---看看

本文链接: https://lsjlt.com/news/191208.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • skynet---3---看看
    #ifndef SKYNET_HARBOR_H #define SKYNET_HARBOR_H #include <stdint.h> #include <stdlib.h> #define GLOBALNAME_L...
    99+
    2023-01-31
    skynet
  • eva0.4.1源码看看3
    #ifndef EVANETWORK_H #define EVANETWORK_H #include <qobject.h> #include <qhostaddress.h> class EvaSocket; c...
    99+
    2023-01-31
    源码
  • Kindle 3之看图
    通过下面这个方法喜欢看图片漫画的朋友就可以轻松的在K3上看漫画了,图片效果要比在多看系统里面好很多。 Kindle 3支持jpg,gif和png的图片格式,但并不是把图片文件拷贝到根目录,就可以查看的到。下面来说一下在Kindle 3中查...
    99+
    2023-01-31
    看图 Kindle
  • 3分钟看完MongoDB3.6新特性
    <div align=center></div></br> 3分钟看完MongoDB3.6新特性 </br> Default Bind to Localh...
    99+
    2024-04-02
  • kindle 3之安装多看系统
    最近看刘晖的评论发现K3确实不错,虽然是英文的系统,但是国内已经有针对K3的中文系统了,多看系统。   下面就借别人写过的文章介绍介绍多看系统,大家可以从www.duokan.com中下在最新的系统来安装。 到多看论坛下载9.18版...
    99+
    2023-01-31
    多看 系统 kindle
  • 3.文件查看及内容处理
    1.cat功能:连接文件和标准输出打印语法:cat [OPTION]... [FILE]...常用选项:-A:查看所有,相当于-vET选项,可以列出特殊字符-b:打印非空行行号-E:显示结尾的断行字节$-n:打印所有行号-T:将tab键以^...
    99+
    2023-01-31
    文件 内容
  • Google I/O 2023 - Dart 3 发布,快来看看有什么更新吧
    核心原文链接: https://medium.com/dartlang/announcing-dart-3-53f065a10635 自从 Flutter Forword 发布了 Dart 3α...
    99+
    2023-08-31
    flutter android ios
  • centos如何查看3星级的docker镜像
    这篇文章主要介绍了centos如何查看3星级的docker镜像,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。查看3星级的镜像docker&n...
    99+
    2024-04-02
  • 分享一道不错的TS面试题(含3层),看看能答到第几层!
    最近遇见一道不错的 TS 面试题,分享一下。这道题有 3 个层次,我们一层层来看。第一层的要求是这样的:实现一个 zip 函数,对两个数组的元素按顺序两两合并,比如输入 [1,2,3], [4,5,6] 时,返回 [[1,4], [2,5]...
    99+
    2023-05-14
    前端 JavaScript TypeScript
  • 3分钟学会如何上手supervisor看门狗
    软硬件环境 centos7.6.1810 64bit cat /etc/redhat-release #查看系统版本 supervisor 3.4.0 python 2.7.5 supervis...
    99+
    2022-06-04
    supervisor看门狗 python supervisor
  • 3个看似简单的Python问题是什么
    本篇内容主要讲解“3个看似简单的Python问题是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“3个看似简单的Python问题是什么”吧!问题1假设我们有几个变量:x = ...
    99+
    2023-06-16
  • Linux 中实时查看日志的3种方法
    Linux 中实时查看日志的3种方法 最近我从cnaaa.com购买了云服务器。 我们大家应该都知道如何在 Linux 中查看文件,比如可以使用 cat 或者 less 命令。 这对于查看静态文件来说是可以的。日志文件是动态的,其内容随时会...
    99+
    2023-08-18
    linux 服务器 运维
  • H3C认证有3大好处,大家仔细看哦
    随着全国铺天盖地的证书潮不断涌来,忙着培训,忙着考证,已然成为致力于在软、硬件工程研究者和从业者们的生活方式。在忙碌的考试压力和较高的培训经济压力下,精疲力竭的人们不禁要问,证书到底有作用吗?我们这些刚毕业的大学生或者打算转战IT业的同仁们...
    99+
    2023-01-31
    仔细看 好处 H3C
  • 回过头来看看python
    大一上学了python,苦逼学生党一抹黑,学完后写了个屌丝级作业,不算学到什么东西,但是也总算是入门了,大一下学了学c++,又看了看java,茫然的不知道自己到底学了什么,看着一个个同学都已经成为大神,我还在技术屌丝奋斗,看了c#贴吧里的一...
    99+
    2023-01-31
    回过头来 python
  • 月薪3万的python程序员都看了这本书
    想必大家都看过吧 Python编程从入门到实践 全书共有20章,书中的简介如下: 本书旨在让你尽快学会 Python ,以便能够编写能正确运行的程序 —— 游戏、数据可视化和 Web 应用程序,同时掌握让你终身受益的基本编程知识。本书适合...
    99+
    2023-01-30
    看了 这本书 程序员
  • Nginx教程(小白必看,看了必会,不看血亏),
    Notice 测试请打开浏览器禁止缓存 Notice:再使用前,请打开浏览器 F12 然后网络 然后点禁用缓存,避免nginx配置后磁盘缓存的情况。而且,请确认host没问题。 备注:你本地设置的host对服务器反向代理后的就没用了 一、介...
    99+
    2023-08-18
    nginx 服务器 运维
  • Sql Server Proc 先看看简单吧
    CREATE PRoc [名字] { @参数 数据类型, @参数 数据类型 OUTPUT[输入] } AS begin select INSERT UPDATE (SQL) end --基本语句快 --以上是语...
    99+
    2018-07-18
    Sql Server Proc 先看看简单吧
  • 从程序员的角度来看,有哪3种进程状态?
    从程序员的角度来看,进程有3种状态。1、进行中进程正在运行,或者等待被执行。2、挂起(也叫停止)临时挂起, 比如执行了sleep(),wait()函数等。 直到收到SIGCONT信号接着运行进程。3、终止进程已经永远结束,等待父进程回收或已...
    99+
    2024-04-02
  • 3、wampserver中查看各项当前版本及简单配置PHP
    wampserver点击左键,即可查看Apache,PHP,MySQL,MariaDB的当前版本     在wampserver的安装目录中,在相应的D:\wamp64\bin\php\php8.0.26 php.ini文件中,short_...
    99+
    2023-09-04
    php
  • 查看alert.log
    一、通过OEM 来查看。二、使用文本编辑器来查看。1、使用查询工具登录到数据库,比如sql*plus.2、查询v$diag_info 视图定位 alert log的位置。SQL> select...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作