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

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