开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
开源项目 > 程序开发 > 编程语言/脚本语言 &&
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
13 Star 69 Fork 22

johnsonyl/cpps

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
标签 (4)
master
v1.0.3-beta
v1.0.3
v1.0.2
v1.0.0
master
分支 (1)
标签 (4)
master
v1.0.3-beta
v1.0.3
v1.0.2
v1.0.0
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
标签 (4)
master
v1.0.3-beta
v1.0.3
v1.0.2
v1.0.0
cpps
/
src
/
cpps_asyncio.cpp
cpps
/
src
/
cpps_asyncio.cpp
cpps_asyncio.cpp 5.38 KB
一键复制 编辑 原始数据 按行查看 历史
johnsonyl 提交于 2024年01月05日 22:20 +08:00 . 修复MACOS 编译错误和警告
#include "cpps/cpps.h"
#include <chrono>
namespace cpps {
cpps_integer cpps_time_gettickcount();
cpps_async_loop* cpps_async_get_event_loop(C* c) {
return (cpps_async_loop*)c->getmoduledata("asyncio");
}
cpps_value cpps_async_run(C* c, cpps_value obj) {
return cpps_async_get_event_loop(c)->run_until_complete(c,obj);
}
cpps_integer cpps_async_get_current_id(C* c) {
return (cpps_integer)c->ordinator->current;
}
bool cpps_async_isterminate(C* c) {
return c->ordinator->isterminate;
}
cpps_value cpps_async_await(C* c, cpps_value var) {
cpps_async_task* vtask = NULL;
cpps_value ret;
cpps_async_loop* loop = cpps_async_get_event_loop(c);
if (var.isdomain() && var.is_kindof<cpps_async_object>()) {
cpps_async_object* obj = cpps_converter<cpps_async_object*>::apply(var);
if (obj->get_task() == NULL) {
ret = loop->create_task(c, obj, &vtask);
loop->push_task(c, ret);
}
else {
vtask = obj->get_task();
object task(c, vtask);
ret = task.getval();
}
}
else if (var.isdomain() && var.is_kindof<cpps_async_task>()) {
vtask = cpps_converter<cpps_async_task*>::apply(var);
ret = var;
}
else {
throw(cpps_error(c->curnode->filename, c->curnode->line, cpps_error_asyncerror, "await just support ASYNC_OBJECT or ASYNC_TASK."));
}
int8 status = vtask->state();
while (status == cpps_async_task_running) {
coroutine::yield(*loop->ordinator);
status = vtask->state();
}
return ret;
}
cpps_value cpps_async_wait_for(C* c, cpps_value var,cpps_integer ms) {
cpps_async_task* task = NULL;
cpps_value ret;
cpps_async_loop* loop = cpps_async_get_event_loop(c);
if (var.isdomain() && var.is_kindof<cpps_async_object>()) {
cpps_async_object* obj = cpps_converter<cpps_async_object*>::apply(var);
if (obj->get_task() == NULL) {
ret = loop->create_task(c, cpps_converter<cpps_async_object*>::apply(var), &task);
loop->push_task(c, ret);
}
else {
task = obj->get_task();
object _task(c, task);
ret = _task.getval();
}
}
else if (var.isdomain() && var.is_kindof<cpps_async_task>()) {
task = cpps_converter<cpps_async_task*>::apply(var);
ret = var;
}
else {
throw(cpps_error(c->curnode->filename, c->curnode->line, cpps_error_asyncerror, "wait_for just support ASYNC_OBJECT or ASYNC_TASK."));
}
cpps_integer start = cpps_time_gettickcount();
int8 status = task->state();
while (status == cpps_async_task_running) {
if (cpps_time_gettickcount() - start > ms) {
task->runstate = cpps_async_task_timeouted;
break;
}
coroutine::yield(*loop->ordinator);
status = task->state();
}
return ret;
}
cpps_value cpps_async_create_task(C* c,cpps_async_object *obj) {
cpps_async_loop* loop = (cpps_async_loop*)c->getmoduledata("asyncio");
cpps_value ret;
if (obj->get_task() == NULL) {
cpps_async_task* task;
ret = loop->create_task(c, obj, &task);
loop->push_task(c, ret); /*Ĭִж*/
}
else {
object task(c, obj->get_task());
ret = task.getval();
}
return ret;
}
void cpps_async_sleep(C*c,cpps_integer ms) {
asyncio::wait_for(c,std::this_thread::sleep_for<cpps_integer, std::milli>, std::chrono::milliseconds(ms));
}
void cpps_initasyncio(C* c)
{
cpps_async_loop* loop = CPPSNEW(cpps_async_loop)();
loop->setcstate(c);
c->setmoduledata("asyncio", (cpps_module_data*)loop);
}
void cpps_regasyncio(C* c)
{
cpps_initasyncio(c);
cpps::_module(c, "asyncio")[
_class<cpps_async_object>("ASYNC_OBJECT")
.def_inside("done", &cpps_async_object::done)
.def_inside("catch", &cpps_async_object::_catch)
.def_inside("then", &cpps_async_object::done),
_class<cpps_async_loop>("ASYNC_LOOP")
.def_inside("run_until_complete", &cpps_async_loop::run_until_complete),
_class<cpps_async_task>("ASYNC_TASK")
.def_inside("result",&cpps_async_task::getresult)
.def("state",&cpps_async_task::state)
.def("cancelled",&cpps_async_task::cancelled)
.def("done",&cpps_async_task::done)
.def("timeout",&cpps_async_task::timeout)
.def("pending",&cpps_async_task::pending)
.def("running",&cpps_async_task::running)
.def("set_name",&cpps_async_task::set_name)
.def("get_name",&cpps_async_task::get_name)
.def("get_id",&cpps_async_task::get_id)
.def("add_done_callback",&cpps_async_task::add_done_callback)
.def("remove_done_callback",&cpps_async_task::remove_done_callback),
def_inside("get_event_loop", cpps_async_get_event_loop),
def_inside("create_task", cpps_async_create_task),
def_inside("sleep", cpps_async_sleep,true),
def_inside("wait", cpps_async_await,true),
def_inside("wait_for", cpps_async_wait_for,true),
def_inside("run", cpps_async_run),
def_inside("is_terminate",cpps_async_isterminate),
defvar(c,"pending", (cpps_integer) cpps_async_task_pending),
defvar(c,"running", (cpps_integer)cpps_async_task_running),
defvar(c,"done", (cpps_integer)cpps_async_task_done),
defvar(c,"cancelled", (cpps_integer)cpps_async_task_cancelled),
defvar(c,"timeout", (cpps_integer)cpps_async_task_timeouted),
def_inside("get_current_id", cpps_async_get_current_id)
];
}
void cpps_unregasyncio(C* c)
{
cpps_async_loop* loop = (cpps_async_loop*)c->getmoduledata("asyncio");
if(loop) CPPSDELETE( loop);
c->setmoduledata("asyncio", NULL);
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

CPPS是一种轻量级的嵌入式脚本语言,其语法类似于C++。它具有当前主流语言的许多特性,包括协程、面向对象、lambda、闭包、泛型变量、自定义模块支持、GC垃圾收集和跨平台。CPPS将程序解释为字节码,通过内置语法解析在虚拟机中运行
取消

发行版 (3)

全部

开源评估指数源自 OSS-Compass 评估体系,评估体系围绕以下三个维度对项目展开评估:

1. 开源生态

  • 生产力:来评估开源项目输出软件制品和开源价值的能力。
  • 创新力:用于评估开源软件及其生态系统的多样化程度。
  • 稳健性:用于评估开源项目面对多变的发展环境,抵御内外干扰并自我恢复的能力。

2. 协作、人、软件

  • 协作:代表了开源开发行为中协作的程度和深度。
  • 人:观察开源项目核心人员在开源项目中的影响力,并通过第三方视角考察用户和开发者对开源项目的评价。
  • 软件:从开源项目对外输出的制品评估其价值最终落脚点。也是开源评估最"古老"的主流方向之一"开源软件" 的具体表现。

3. 评估模型

    基于"开源生态"与"协作、人、软件"的维度,找到与该目标直接或间接相关的可量化指标,对开源项目健康与生态进行量化评估,最终形成开源评估指数。

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/cppscript/cpps.git
git@gitee.com:cppscript/cpps.git
cppscript
cpps
cpps
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /