rng: move request queue from RngEgd to RngBackend
The 'requests' field now lives in the RngBackend parent class. There are no functional changes in this commit. Signed-off-by: Ladi Prosek <lprosek@redhat.com> Reviewed-by: Amit Shah <amit.shah@redhat.com> Message-Id: <1456994238-9585-3-git-send-email-lprosek@redhat.com> Signed-off-by: Amit Shah <amit.shah@redhat.com>
This commit is contained in:
		
							parent
							
								
									3c52ddcdc5
								
							
						
					
					
						commit
						74074e8a7c
					
				@ -25,19 +25,8 @@ typedef struct RngEgd
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    CharDriverState *chr;
 | 
					    CharDriverState *chr;
 | 
				
			||||||
    char *chr_name;
 | 
					    char *chr_name;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    GSList *requests;
 | 
					 | 
				
			||||||
} RngEgd;
 | 
					} RngEgd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct RngRequest
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    EntropyReceiveFunc *receive_entropy;
 | 
					 | 
				
			||||||
    uint8_t *data;
 | 
					 | 
				
			||||||
    void *opaque;
 | 
					 | 
				
			||||||
    size_t offset;
 | 
					 | 
				
			||||||
    size_t size;
 | 
					 | 
				
			||||||
} RngRequest;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void rng_egd_request_entropy(RngBackend *b, size_t size,
 | 
					static void rng_egd_request_entropy(RngBackend *b, size_t size,
 | 
				
			||||||
                                    EntropyReceiveFunc *receive_entropy,
 | 
					                                    EntropyReceiveFunc *receive_entropy,
 | 
				
			||||||
                                    void *opaque)
 | 
					                                    void *opaque)
 | 
				
			||||||
@ -66,7 +55,7 @@ static void rng_egd_request_entropy(RngBackend *b, size_t size,
 | 
				
			|||||||
        size -= len;
 | 
					        size -= len;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s->requests = g_slist_append(s->requests, req);
 | 
					    s->parent.requests = g_slist_append(s->parent.requests, req);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void rng_egd_free_request(RngRequest *req)
 | 
					static void rng_egd_free_request(RngRequest *req)
 | 
				
			||||||
@ -81,7 +70,7 @@ static int rng_egd_chr_can_read(void *opaque)
 | 
				
			|||||||
    GSList *i;
 | 
					    GSList *i;
 | 
				
			||||||
    int size = 0;
 | 
					    int size = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = s->requests; i; i = i->next) {
 | 
					    for (i = s->parent.requests; i; i = i->next) {
 | 
				
			||||||
        RngRequest *req = i->data;
 | 
					        RngRequest *req = i->data;
 | 
				
			||||||
        size += req->size - req->offset;
 | 
					        size += req->size - req->offset;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -94,8 +83,8 @@ static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)
 | 
				
			|||||||
    RngEgd *s = RNG_EGD(opaque);
 | 
					    RngEgd *s = RNG_EGD(opaque);
 | 
				
			||||||
    size_t buf_offset = 0;
 | 
					    size_t buf_offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (size > 0 && s->requests) {
 | 
					    while (size > 0 && s->parent.requests) {
 | 
				
			||||||
        RngRequest *req = s->requests->data;
 | 
					        RngRequest *req = s->parent.requests->data;
 | 
				
			||||||
        int len = MIN(size, req->size - req->offset);
 | 
					        int len = MIN(size, req->size - req->offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        memcpy(req->data + req->offset, buf + buf_offset, len);
 | 
					        memcpy(req->data + req->offset, buf + buf_offset, len);
 | 
				
			||||||
@ -104,7 +93,8 @@ static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)
 | 
				
			|||||||
        size -= len;
 | 
					        size -= len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (req->offset == req->size) {
 | 
					        if (req->offset == req->size) {
 | 
				
			||||||
            s->requests = g_slist_remove_link(s->requests, s->requests);
 | 
					            s->parent.requests = g_slist_remove_link(s->parent.requests,
 | 
				
			||||||
 | 
					                                                     s->parent.requests);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            req->receive_entropy(req->opaque, req->data, req->size);
 | 
					            req->receive_entropy(req->opaque, req->data, req->size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -117,12 +107,12 @@ static void rng_egd_free_requests(RngEgd *s)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    GSList *i;
 | 
					    GSList *i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = s->requests; i; i = i->next) {
 | 
					    for (i = s->parent.requests; i; i = i->next) {
 | 
				
			||||||
        rng_egd_free_request(i->data);
 | 
					        rng_egd_free_request(i->data);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_slist_free(s->requests);
 | 
					    g_slist_free(s->parent.requests);
 | 
				
			||||||
    s->requests = NULL;
 | 
					    s->parent.requests = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void rng_egd_opened(RngBackend *b, Error **errp)
 | 
					static void rng_egd_opened(RngBackend *b, Error **errp)
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,7 @@
 | 
				
			|||||||
#define RNG_BACKEND_CLASS(klass) \
 | 
					#define RNG_BACKEND_CLASS(klass) \
 | 
				
			||||||
    OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND)
 | 
					    OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct RngRequest RngRequest;
 | 
				
			||||||
typedef struct RngBackendClass RngBackendClass;
 | 
					typedef struct RngBackendClass RngBackendClass;
 | 
				
			||||||
typedef struct RngBackend RngBackend;
 | 
					typedef struct RngBackend RngBackend;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -31,6 +32,15 @@ typedef void (EntropyReceiveFunc)(void *opaque,
 | 
				
			|||||||
                                  const void *data,
 | 
					                                  const void *data,
 | 
				
			||||||
                                  size_t size);
 | 
					                                  size_t size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RngRequest
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EntropyReceiveFunc *receive_entropy;
 | 
				
			||||||
 | 
					    uint8_t *data;
 | 
				
			||||||
 | 
					    void *opaque;
 | 
				
			||||||
 | 
					    size_t offset;
 | 
				
			||||||
 | 
					    size_t size;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct RngBackendClass
 | 
					struct RngBackendClass
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ObjectClass parent_class;
 | 
					    ObjectClass parent_class;
 | 
				
			||||||
@ -47,6 +57,7 @@ struct RngBackend
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /*< protected >*/
 | 
					    /*< protected >*/
 | 
				
			||||||
    bool opened;
 | 
					    bool opened;
 | 
				
			||||||
 | 
					    GSList *requests;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user