鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

多线程支持

WD算法层支持同步调用和异步调用,线程模型如图1所示

图1 WD算法层线程模型

上图中,序号3的call back中可以再创建线程执行耗时长的任务,避免阻塞。

线程模型

  • 同步调用的情况下,每个线程用一个Context作为上下文通过wd_send发送请求,这些请求进入queue之后,该线程基于Context通过wd_recv循环查询数据是否处理完成。处理流程和2.2.3.1默认流程中顺序调用步骤一致,伪代码可以参考接口使用示例
  • 异步调用的情况下,可以使用任意线程把Context作为上下文调用wd_send,同时建立一个poll线程调用算法层的poll接口,如果有数据处理完,就找出Context并调用该Context的回调函数,回调函数中可以再创建线程执行耗时长的任务,避免阻塞。还是以HASH算法为例,处理流程和同步流程的用法如下,伪代码可以参考接口使用示例
  1. 申请队列前,和默认场景一样,声明一个struct wd_queue的结构体变量并在这个成员变量capa的成员变量alg中指定需要的算法字符串。
  2. 申请队列时,和默认场景一样,取第1步struct wd_queue结构体变量的地址作为参数,调用int wd_request_queue(struct wd_queue *q)申请指定算法的队列。
  3. 创建算法context时,和默认场景一样,调用wcrypto_create_digest_ctx函数创建context。
  4. 调用算法操作前,和默认场景一样,声明一个该算法的操作结构体struct wcrypto_digest_op_data变量,设置好成员in、ou、in_bytes、out_bytes等。处理完之后由用户负责释。
  5. 调用算法操作前,定义好回调函数,用于处理硬件返回的数据。回调函数中可以再创建线程执行耗时长的任务,避免阻塞其它任务。
  6. 调用算法操作前,定义好poll线程的函数,函数中需要调用wcrypto_digest_poll函数。wcrypto_digest_poll中将通过WD基础层recv接口将硬件处理好的数据填到第4步声明的struct wcrypto_digest_op_data变量的成员变量out中,再根据context调用定义的回调函数。
  7. 调用算法操作前,建立一个poll线程,并把struct wd_queue结构体变量的地址作为参数给该线程函数。
  8. 调用算法操作时,取第3步返回的context指针、第4步struct wcrypto_digest_op_data变量地址和把第5步定义好的回调函数作为参数,调用wcrypto_do_digest函数将数据通过WD基础层send接口交给加速器硬件,成功则返回0;失败则返回负值。
  9. 释放算法context时,取第3步返回的context指针作为参数,调用wcrypto_del_digest_ctx函数释放context。
  10. 待poll线程接收数据并调用回调函数,回调函数处理完加速器返回的数据之后,释放struct wcrypto_digest_op_data变量涉及到的in、out内存。
  11. 释放队列时,等待线程结束后,取第1步struct wd_queue结构体变量的地址作为参数,调用void wd_release_queue(struct wd_queue *q)释放队列和涉及到的硬件资源。