rng_egd_chr_read分析

来源:互联网 发布:finale 2016 mac 编辑:程序博客网 时间:2024/06/06 11:48

backends/rng-egd.c

------

buf即Rng的物理buffer指针,size即为Rng的buffer的大小。

static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)

{
    RngEgd *s = RNG_EGD(opaque);
    size_t buf_offset = 0;

    while (size > 0 && s->requests) {
        RngRequest *req = s->requests->data;
        int len = MIN(size, req->size - req->offset);

//如果请求的size(即req->size)大于size,则本次只可以读取Rng缓冲区大小的数据(即size大小的数据)


        memcpy(req->data + req->offset, buf + buf_offset, len);//buf+buf_offset的patch很好!!!当req->size > size时,下次重新再读该缓存的时候,重新调用rng_egd_chr_read函数,buf_offset重新被赋值为0.很好!!!
        buf_offset += len;
        req->offset += len;//以备下次读取的时候,不再读取上次已经读取过的数据。因为本次请求的数据大于Rng的缓冲区大小,所以只能等到Rng刷新缓冲区以后,再次读取本次请求还需读取的数据。
---
第二种情况,如果本次请求的size小于size的大小,则会不断循环的处理请求链表上的请求。直到Rng的buf为空。
---
        size -= len;

        if (req->offset == req->size) {

            s->requests = g_slist_remove_link(s->requests, s->requests);

//如果本次请求处理完了,则把本次请求从请求链表上删除。


            req->receive_entropy(req->opaque, req->data, req->size);

            rng_egd_free_request(req);
        }
    }
}
0 0
原创粉丝点击