GithubHelp home page GithubHelp logo

owent / libcopp Goto Github PK

View Code? Open in Web Editor NEW
824.0 41.0 105.0 2.65 MB

cross-platform coroutine library in c++

License: MIT License

CMake 3.02% C++ 62.34% C 1.10% Shell 1.30% Assembly 31.02% Batchfile 0.02% PowerShell 1.19%
boost coroutine cpp cross-platform performance c-plus-plus assembly await then timer

libcopp's Introduction

libcopp's People

Contributors

owent avatar vbirds avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

libcopp's Issues

请教关于开启协程的问题

Description of your problem.
作者你好,请教一下在开启协程执行一个函数的时候,如何向该函数传递参数呢,我只在example中看到参数为void *

Describe the solution you'd like
我想在一个while循环中开启协程执行std::size_t copy_buffer(boost::asio::ip::tcp::socket &write_dst, boost::asio::ip::tcp::socket &read_src)函数
我想实现的功能伪代码如下:

void relay(boost::asio::ip::tcp::socket &dst, boost::asio::ip::tcp::socket &src) {
    copp::coroutine_context_default::ptr_t co_obj_to = copp::coroutine_context_default::create(copy_buffer(dst, src));
    copp::coroutine_context_default::ptr_t co_obj_from = copp::coroutine_context_default::create(copy_buffer(src, dst));
    while (true){
        co_obj_to->start();
        co_obj_from->start();
    }
}

协程栈的大小的问题

你好,
OWenT, 协程栈的大小代码中使用最小的是64KB。这个看了代码发现这主要是跟min_stack size 和max_stack_size有关,而且对对齐了内存管理的page size. 这个大小有点大, 如果是10w个协程的话,需要6250Mb内存. 如果最小的栈大小过大的话, 很可能导致大量的内存浪费.

couldn't complie on aarch64 platform

CMake Error at src/libcopp/CMakeLists.txt:14 (add_library):
Cannot find source file:

/root/test/libcopp-1.2.1/src/libcopp/fcontext/asm/jump_aarch64_sysv_elf_gas.S

请教关于task超时的问题

在 sleep 6秒后调用tick函数,发现打印的协成状态并非超时状态。查看代码看到last_tick_time_初始化是0,
如果在启动任务前,没有调用过tick函数,就无法触发超时状态。想请教下这样是否有问题?

代码如下:

#include <inttypes.h>
#include <stdint.h>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iostream>

// include context header file
#include <libcotask/task.h>
#include <libcotask/task_manager.h>

// create a task manager
typedef cotask::task<> my_task_t;
typedef my_task_t::ptr_t task_ptr_type;
typedef cotask::task_manager<my_task_t> mgr_t;
mgr_t::ptr_t task_mgr = mgr_t::create();

// If you task manager to manage timeout, it's important to call tick interval

void tick() {
  // the first parameter is second, and the second is nanosecond
  task_mgr->tick(time(nullptr), 0);
}

int main() {
  // create two coroutine task
  task_ptr_type co_task = my_task_t::create([]() {
    std::cout << "task " << cotask::this_task::get<my_task_t>()->get_id() << " started" << std::endl;
    cotask::this_task::get_task()->yield();
    std::cout << "task " << cotask::this_task::get<my_task_t>()->get_id() << " resumed" << std::endl;
    return 0;
  });
  task_ptr_type co_another_task = my_task_t::create([]() {
    std::cout << "task " << cotask::this_task::get<my_task_t>()->get_id() << " started" << std::endl;
    cotask::this_task::get_task()->yield();

    cotask::EN_TASK_STATUS status = cotask::this_task::get<my_task_t>()->get_status();

    std::cout << "task " << cotask::this_task::get<my_task_t>()->get_id() << " resumed" << " status: " << status << std::endl;
    return 0;
  });

  int res = task_mgr->add_task(co_task, 5, 0);  // add task and setup 5s for timeout
  if (res < 0) {
    std::cerr << "some error: " << res << std::endl;
    return res;
  }

  res = task_mgr->add_task(co_another_task, 5, 0);  // add task without timeout
  if (res < 0) {
    std::cerr << "some error: " << res << std::endl;
    return res;
  }

  res = task_mgr->start(co_task->get_id());
  if (res < 0) {
    std::cerr << "start task " << co_task->get_id() << " failed, error code: " << res << std::endl;
  }

  res = task_mgr->start(co_another_task->get_id());
  if (res < 0) {
    std::cerr << "start task " << co_another_task->get_id() << " failed, error code: " << res << std::endl;
  }

  res = task_mgr->resume(co_task->get_id());
  if (res < 0) {
    std::cerr << "resume task " << co_task->get_id() << " failed, error code: " << res << std::endl;
  }

  sleep(6);
  tick();

  return 0;
}

输出:

task 54892719658500096 started
task 54892719658500097 started
task 54892719658500096 resumed
task 54892719658500097 resumed status: 6

error: ‘xx’ is not a member of ‘xxx {aka xxx}’

使用task action,写一个自定义的action 类
class ThenTaskAction1
{
public:
ThenTaskAction1(){}

int operator()(void*)
{
    return 0;
}

private:
};

然后调用copp_task的then方法:
using simple_task_t = cotask::task<>;
auto co_task = simple_task_t::create(
{
});
if (nullptr != co_task)
{
co_task->start();
//auto then_ptr1 = co_task->then(ThenTaskAction1()); // build OK

       ThenTaskAction1 tmp;
        auto then_ptr2 = co_task->then(tmp);                                 // 错误: ThenTaskAction1没有operator()成员 
    }
    else
        printf("error create coroutine %d\n", i);

我这边跟踪了一下原因是后面一种调用在模板参数类型是ThenTaskAction1&, 然而前者解释模板参数类型是ThenTaskAction1
于是我这边的解决方式是
在task_actions.h:91行改成
virtual int operator()(void *priv_data) {
return detail::task_action_functor_check::call(&std::remove_reference<value_type>::type::operator(), functor_, priv_data);
}
去掉了引用

看一下大神有什么好的解决方式或者有什么见解

关于 copp::coroutine_context_default::ptr_t 的疑问

`
#include <libcopp/coroutine/coroutine_context_container.h>
typedef copp::coroutine_context_default coroutine_t;

void download_other_thread(copp::coroutine_context* ctx)
{
std::this_thread::sleep_for(std::chrone::second(6));
ctx->resume();
}

int co_download(void ){
copp::coroutine_context
ctx = copp::this_coroutine::get_coroutine();
thread_pool::add(download_other_thread, ctx); // 其他线程处理具体的逻辑
ctx->yield();

printf("done!\n");

}

int main () {
for (int i= 0;i< 5;++i){
coroutin_t::ptr_t context = coroutine_t::create(co_download);
context->start();
// context.detach();
}

for (;;){}
return 0 

}
`

我希望是co_download 时候抛给其他线程处理,yield, 然后其他线程处理后 resume
但是这样是会抛错的, 因为 context 已经析构了
我看到 copp::this_coroutine::get_coroutine() 其实就是 context.get()
所以 context.detach() 后是可以的

但是这样疑惑就是 这个 ptr 我怎么主动 delete ? 还是说不用管?

我觉得你的框架非常好用, 就是这个疑问我一直困扰着.
不知都是不是我的使用思路有问题, 如果是的话, 上面那个需求怎么实现 ?
谢谢

Windows CMake 编译报错:Unknown CMake command "echowithcolor"

Description of your problem.
在Windows上用CMake(3.27.1) 编译最新版本2.2.0报错:Unknown CMake command "echowithcolor"
构建命令:cmake .. -DPROJECT_ENABLE_UNITTEST=YES -DPROJECT_ENABLE_SAMPLE=YES

Describe the solution you'd like
A clear and concise description of what you want to happen.

无效的开关PROJECT_DISABLE_MT说明

文档中说多线程支持的开关PROJECT_DISABLE_MT, 但是在构建脚本中没有看到
但是有个锁的开关LIBCOPP_DISABLE_ATOMIC_LOCK, 是不是一回事?

vcpkg安装的1.4.1版本,编译时报错

OS: ubuntu18.04
Compiler: gcc 11.1.0
安装方式: ./vcpkg install libcopp:x64-linux
项目Cmake配置
target_link_libraries(NFMasterServerPlugin libcopp.a)
target_link_libraries(NFMasterServerPlugin libcotask.a)
报错信息
err

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.