跳转至

2. 全局设置

全局配置位于头文件coke/global.h中,包含以下内容。

版本号

Coke定义了一个宏COKE_VERSION_NUMBER,以数值常量的形式表示当前代码的版本号,例如当版本号为v1.2.3时,该常量的值为0x010203L,便于在预处理阶段判断版本号。

同时在coke命名空间定义了以下几个常量,例如当版本号为v1.2.3

constexpr int COKE_MAJOR_VERSION = 1;
constexpr int COKE_MINOR_VERSION = 2;
constexpr int COKE_PATCH_VERSION = 3;

以及字符串常量constexpr const char COKE_VERSION_STR[] = "1.2.3";

任务状态码

定义了以下常量

// state constant from workflow, see WFTask.h
constexpr int STATE_UNDEFINED = -1;
constexpr int STATE_SUCCESS = 0;
constexpr int STATE_TOREPLY = 3;
constexpr int STATE_NOREPLY = 4;
constexpr int STATE_SYS_ERROR = 1;
constexpr int STATE_SSL_ERROR = 65;
constexpr int STATE_DNS_ERROR = 66;
constexpr int STATE_TASK_ERROR = 67;
constexpr int STATE_ABORTED = 2;

以及与超时原因相关的状态码

// timeout reason constant from workflow, see CommRequest.h
constexpr int CTOR_NOT_TIMEOUT = 0;
constexpr int CTOR_WAIT_TIMEOUT = 1;
constexpr int CTOR_CONNECT_TIMEOUT = 2;
constexpr int CTOR_TRANSMIT_TIMEOUT = 3;

Coke应保证上述状态码与Workflow中的值完全一致,用户可自由选择使用哪种方式。

带超时时间的操作的状态码

Coke中提供了一系列异步组件,例如coke::Mutexcoke::Queue等,其中coke::Mutex::try_lock_forcoke::Queue<T>::try_push_for等需要指定超时时间的接口,这些协程返回一个int类型的整数,其含义如下所示。对于coke::Mutex::lock等接口,虽未显式指定超时时间,但可以看做是超时时间无限的try_lock_for调用,因此返回值含义也一致。其中TOP理解为Timed OPerationThis OPerationThe OPeration均可。

// 该操作成功完成。
constexpr int TOP_SUCCESS = 0;
// 该操作未能成功,且已经到达了超时时间。
constexpr int TOP_TIMEOUT = 1;
// 进程正在退出,但仍有协程没有执行完成,其中的休眠任务以该状态失败。Coke强列建议在主线程退出前
// 等待所有协程退出,以免丢失重要数据。
constexpr int TOP_ABORTED = 2;
// 异步容器关闭后,若 1. 再向其中添加数据 或2. 容器为空后再尝试取数据时,返回该状态码。
constexpr int TOP_CLOSED = 3;
// 若返回值为负数,表示在异步等待过程中遇到了系统错误,通常不会出现。

全局配置

coke::GlobalSettingsWorkflow中的WFGlobalSettings含义一致。coke::EndpointParams::EndpointParams的一个别名。

using EndpointParams = ::EndpointParams;

struct GlobalSettings {
    EndpointParams endpoint_params;
    EndpointParams dns_server_params;
    unsigned int dns_ttl_default        = 3600;
    unsigned int dns_ttl_min            = 60;
    int dns_threads                     = 4;
    int poller_threads                  = 4;
    int handler_threads                 = 20;
    int compute_threads                 = -1;
    int fio_max_events                  = 4096;
    const char *resolv_conf_path        = "/etc/resolv.conf";
    const char *hosts_path              = "/etc/hosts";
};

辅助函数

  • 全局初始化函数,含义与WORKFLOW_library_init一致

    void library_init(const GlobalSettings &s);
    
  • 获取错误码对应的文本描述,与WFGlobal::get_error_string一致

    const char *get_error_string(int state, int error);
    
  • 获取一个当前进程全局唯一的uint64_t类型的标记

    • 该函数用于以id为标记的休眠任务,会在相关章节中展示具体用法。若每纳秒调用一次该函数,则所有可用id会在持续运行约583年后耗尽,此后不再保证正确性,建议在此之前重启一次进程。
    • 常量INVALID_UNIQUE_ID用于表示这不是一个从该函数获取到的id。
    uint64_t get_unique_id();
    
    constexpr uint64_t INVALID_UNIQUE_ID = 0;
    
  • 判断是否应尝试切换线程 无栈协程调用下一个协程时会复用线程栈,在某些极端场景下会因递归调用而导致栈溢出,用户一般不会遇到这种场景。当确实遇到这类问题时,每次递归都切换一次线程会有较大的开销,此时可以调用这个函数,并保证当该函数返回true时切换一次线程,例如使用co_await coke::yield();

    bool prevent_recursive_stack(bool clear = false);